140.Python——PySide6 窗体布局:简易计算器实现
在使用PySide或PyQt中,我们可以使用Qt Designer来可视化设计布局,简单方便,容易上手。但有时我们可能需要使用代码生成组件和布局,以提高效率和完成特定的需求。
本文通过简单的实例:简易计算器,来实现一下窗体代码布局和功能的实现。
窗体全局布局有2种:水平QHBoxLayout和垂直QVBoxLayout。
窗体局部布局有4种:水平QHBoxLayout、垂直QVBoxLayout、网络QGridLayout、表单QFormLayout。
先看一下整体效果
一、界面布局设计分析
界面分两大部分,第一部分是一个单行文本框,用来显示过程和结果,第二部分就是数字和功能按钮的网格。
所以界面整体布局:一个全局垂直布局:放置单行文本框和放置一个局部网格布局。
局部网格布局:根据位置放入相应的按钮。
二、代码实现
实现计算结果的关键:eval函数。
eval() 函数用来执行一个字符串表达式,并返回表达式的值
import sys
from PySide6 import QtCore, QtWidgets,QtGui
class MainWindow(QtWidgets.QWidget): #继承QWidget,不是QMainWindows
def __init__(self):
super().__init__()
#定义一个全局垂直布局
self.layout=QtWidgets.QVBoxLayout(self)
#定义一个文本框,用来显示过程和结果
self.lineEdit=QtWidgets.QLineEdit()
self.lineEdit.setAlignment(QtCore.Qt.AlignRight) #靠右对齐
self.lineEdit.setFont(QtGui.QFont("",14)) #设置字体大小
#把文本框放入垂直布局
self.layout.addWidget(self.lineEdit)
#定义一个局部网格布局
self.gridLayout = QtWidgets.QGridLayout()
#把局部网格布局放在全局垂直布局中
self.layout.addLayout(self.gridLayout)
#定义按钮显示名称列表
names = ["Cls", "Bck", "", "Close",
"7", "8", "9", "/",
"4", "5", "6", "*",
"1", "2", "3", "-",
"0", ".", "=", "+"]
#计算按钮放入的行列位置
positions = [(i, j) for i in range(5) for j in range(4)]
#遍历并定义按钮,放入网络相应的位置。
for position, name in zip(positions, names):
if name == "": #跳过空
continue
self.button = QtWidgets.QPushButton(name)
self.button.setFont(QtGui.QFont("",14)) #按钮文本大小设置
self.gridLayout.addWidget(self.button, *position)
#信号槽连接
self.button.clicked.connect(self.button_clicked)
#槽函数
def button_clicked(self):
global s
button = self.sender() #获取按钮
text= button.text() #获取按钮文本
if text == "Cls":
s = ""
elif text == "Bck":
s = s[:-1]
elif text == "Close":
self.close()
elif text == "=":
if s[0] in ["+", "-", "*", "/"] or s[-1] in ["+", "-", "*", "/"]:
QtWidgets.QMessageBox.information(self, "msg", "input Error")
else:
s = str(eval(s))
else:
s = s+text
self.lineEdit.setText(s)
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
win = MainWindow()
win.setWindowTitle("Calc")
#win.setWindowFlags(QtCore.Qt.WindowMinimizeButtonHint)
win.show()
s="" #存放计算表达式
app.exit(app.exec())