目录
今天,我们将展示不使用QT Designer,直接在代码中摆放需要的控件。
显然,适用QT Designer设计UI会更加直观,使用代码摆放需要计算和多次调试才能确认布局,但是代码设计UI的好处就是可以根据工程师的需求灵活高效的布局。
一. UI处理button的核心代码分析
我们还是以计算器为例,我们会发现控件中的button作用类似,那么是否可以将他们归为一类来处理呢?答案是肯定的。我们可以使用列表保存button的名称,使用循环来初始化各个button,示例代码如下,
def setupUi(self):
btnNameList = ['1', '2', '3', '+', '4', '5', '6', '-', '7', '8', '9', '*', 'C', '0', '=', '/']
count = 0
for btnName in btnNameList:
self.btn = QPushButton(btnName, self)
self.btn.clicked.connect(self.btnClicked)
x = count%4
y = int(count/4)
self.btn.move(x*40+10, y*40+100)
self.btn.resize(30, 30)
count += 1
从代码中可以看到,这种方式的确减少提高了代码的使用量,同时取得更好的代码维护效果。至于button的点击事件处理方法,也是集中到一个处理方法“btnClicked”中。
二. 完整代码示例
下面是完整的代码示例,供参考,可以看到代码数量少了很多,仅相当于原来代码的六分之一。当然,在UI设计的直观性方面,不如QT Designer来的直观。
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QLineEdit
class MyWindow(QWidget):
def __init__(self, parent=None):
QWidget.__init__(self, parent=parent)
self.setupUi()
def setupUi(self):
btnNameList = ['1', '2', '3', '+', '4', '5', '6', '-', '7', '8', '9', '*', 'C', '0', '=', '/']
count = 0
for btnName in btnNameList:
self.btn = QPushButton(btnName, self)
self.btn.clicked.connect(self.btnClicked)
x = count%4
y = int(count/4)
self.btn.move(x*40+10, y*40+100)
self.btn.resize(30, 30)
count += 1
self.lineEdit = QLineEdit('', self)
self.lineEdit.move(10, 10)
self.lineEdit.resize(150, 70)
self.setGeometry(200, 200, 170, 300)
self.setWindowTitle('计算器')
def btnClicked(self):
btnText = self.sender().text()
if btnText=='C':
self.lineEdit.clear()
elif btnText=='=':
text = self.lineEdit.text()
self.lineEdit.setText(str(eval(text)))
else:
self.lineEdit.insert(btnText)
if __name__ == '__main__':
app = QApplication(sys.argv)
win = MyWindow()
win.show()
sys.exit(app.exec_())
三. 运行结果
四. 小结
不管是使用QT Designer还是直接代码动态实现,只要能达到目的就行,可根据项目的实际需求来判断。另外,易读性和可维护性,也是好代码的一个十分重要依据。