来源
http://www.python3.vip/tut/py/gui/qt_03/#%E5%8A%A8%E6%80%81%E5%8A%A0%E8%BD%BDui%E6%96%87%E4%BB%B6
回顾
前面的话,我们是已经通过Qt设计师创建了界面的定义
但是这个定义创建完成之后只是存成了一个ui文件
思考
1.我们的程序应该如何使用这个界面呢?
2.我们的程序怎么根据这个ui界面创建出实际的能够展现在显示器上的那种类型的程序界面呢?
尝试解决问题
有了界面定义文件,我们的Python程序就可以从文件中加载UI定义,并且动态地创建一个相应的窗口对象。
pyside2
from PySide2.QtWidgets import QApplication, QMessageBox
from PySide2.QtUiTools import QUiLoader
class Stats:
def __init__(self):
# 从文件中加载UI定义
# 从 UI 定义中动态 创建一个相应的窗口对象
# 注意:里面的控件对象也成为窗口对象的属性了
# 比如 self.ui.button , self.ui.textEdit
self.ui = QUiLoader().load('main.ui')
self.ui.button.clicked.connect(self.handleCalc)
def handleCalc(self):
info = self.ui.textEdit.toPlainText()
salary_above_20k = ''
salary_below_20k = ''
for line in info.splitlines():
if not line.strip():
continue
parts = line.split(' ')
parts = [p for p in parts if p]
name,salary,age = parts
if int(salary) >= 20000:
salary_above_20k += name + '\n'
else:
salary_below_20k += name + '\n'
QMessageBox.about(self.ui,
'统计结果',
f'''薪资20000 以上的有:\n{salary_above_20k}
\n薪资20000 以下的有:\n{salary_below_20k}'''
)
app = QApplication([])
stats = Stats()
stats.ui.show()
app.exec_()
pyqt5
from PyQt5 import uic
class Stats:
def __init__(self):
# 从文件中加载UI定义
self.ui = uic.loadUi("main.ui")
代码演示
将示例中的代码复制到我们的pycharm编辑器中
需要修改ui文件的位置
这个是我的文件树
代码解释
# 从 UI 定义中动态 创建一个相应的窗口对象
# 注意:里面的控件对象也成为窗口对象的属性了
# 比如 self.ui.button , self.ui.textEdit
self.ui = QUiLoader().load('ui_files/stats.ui') # ui文件的相对位置
# 返回一个窗口对象
窗口对象的属性的名字
是和界面设计时的名字
是一一对应的
运行程序
报错
RuntimeError: Unable to open/read ui device
报错的代码
结合错误提示进行思考
解决错误
再次运行程序
我们可以在编辑框中输入一些信息
分析
加载ui文件 & 全手工代码
只是界面发生了改变,里面的处理代码是一样的
def handleCalc(self):
info = self.ui.textEdit.toPlainText()
salary_above_20k = ''
salary_below_20k = ''
for line in info.splitlines():
if not line.strip():
continue
parts = line.split(' ')
parts = [p for p in parts if p]
name,salary,age = parts
if int(salary) >= 20000:
salary_above_20k += name + '\n'
else:
salary_below_20k += name + '\n'
QMessageBox.about(self.ui,
'统计结果',
f'''薪资20000 以上的有:\n{salary_above_20k}
\n薪资20000 以下的有:\n{salary_below_20k}'''
)
使用Qt Designer的好处
- 可以直接先把程序界面的样式设计好,还可以实时预览
- 当我们需要对界面中的某个控件进行改动的时候,不需要改动任何的代码,可以直接在Qt Designer中修改我们代码加载的ui文件
注意:不要忘记【保存】
直接再次运行代码
- 很好地实现了界面设计和功能代码的分离,方便后期维护
重点
def __init__(self):
# 从文件中加载UI定义
# 从 UI 定义中动态 创建一个相应的窗口对象
# 注意:里面的控件对象也成为窗口对象的属性了
# 比如 self.ui.button , self.ui.textEdit
self.ui = QUiLoader().load('../ui_files/stats.ui') # ui文件的相对位置
# 返回一个窗口对象
self.ui.button.clicked.connect(self.handleCalc)