Python Qt 学习笔记(三) Qt Designer

Qt Designer简介

Qt Designer是用Qt Widgets来设计创建GUIs的工具。它能让你用所见即所得的方式定制窗口或者对话框,还能用不同风格和分辨率对设计的GUIs进行测试。

designer.exe在Python安装目录下的\Lib\site-packages\PySide2里。

通过 Qt Designer 设计的界面,最终是保存在一个ui文件中的。打开ui文件,就是一个XML格式的界面定义。

动态加载UI文件

打开designer.exe,通过拖拽控件来制作一个简单的界面

我将这个ui文件保存在E:\python项目\Qt项目\stats.ui

有了界面定义文件,我们的Python程序就可以从文件中加载UI定义,并且动态创建一个相应的窗口对象。

编写Python程序

 1 from PySide2.QtWidgets import QApplication, QMessageBox
 2 from PySide2.QtUiTools import QUiLoader
 3 from PySide2.QtCore import QFile
 4 
 5 
 6 class Stats:
 7 
 8     def __init__(self):
 9         # 从文件中加载UI定义
10         qfile_stats = QFile("E:\\python项目\\Qt项目\\stats.ui")
11         qfile_stats.open(QFile.ReadOnly)
12         qfile_stats.close()
13 
14         # 从 UI 定义中动态 创建一个相应的窗口对象
15         # 注意:里面的控件对象也成为窗口对象的属性了
16         # 比如 self.ui.button , self.ui.textEdit
17         self.ui = QUiLoader().load(qfile_stats)
18 
19         self.ui.pushButton.clicked.connect(self.handleCalc)
20 
21     def handleCalc(self):
22         info = self.ui.textEdit.toPlainText()
23 
24         salary_above_20k = ''
25         salary_below_20k = ''
26         for line in info.splitlines():
27             if not line.strip():
28                 continue
29             parts = line.split(' ')
30 
31             parts = [p for p in parts if p]
32             name, salary, age = parts
33             if int(salary) >= 20000:
34                 salary_above_20k += name + '\n'
35             else:
36                 salary_below_20k += name + '\n'
37 
38         QMessageBox.about(self.ui,
39                           '统计结果',
40                           f'''薪资20000 以上的有:\n{salary_above_20k}
41                     \n薪资20000 以下的有:\n{salary_below_20k}'''
42                           )
43 
44 
45 app = QApplication([])
46 stats = Stats()
47 stats.ui.show()
48 app.exec_()

运行效果图

核心代码是这段

 1     def __init__(self):
 2         # 从文件中加载UI定义
 3         qfile_stats = QFile("E:\\python项目\\Qt项目\\stats.ui")
 4         qfile_stats.open(QFile.ReadOnly)
 5         qfile_stats.close()
 6 
 7         # 从 UI 定义中动态 创建一个相应的窗口对象
 8         # 注意:里面的控件对象也成为窗口对象的属性了
 9         # 比如 self.ui.button , self.ui.textEdit
10         self.ui = QUiLoader().load(qfile_stats)
11 
12         self.ui.pushButton.clicked.connect(self.handleCalc)

这样,调整界面只需在designer里拖拽控件,不用做其他代码修改,Python程序它会自动同步。界面和代码分离。

界面布局 Layout

前面写的程序有个问题,就是整体缩放时,里面的控件没有跟着一起缩放

我们希望里面的控件跟着主窗口一起缩放,Layout就是实现这个功能的。

我们最常用的 Layout布局 有4种,分别是

  • QHBoxLayout 水平布局

QHBoxLayout 把控件从左到右 水平横着摆放,如下所示

  • QVBoxLayout 垂直布局

QHBoxLayout 把控件从上到下竖着摆放,如下所示

  • QGridLayout 表格布局

QGridLayout 把多个控件 格子状摆放,有的控件可以 占据多个格子,如下所示

  • QFormLayout 表单布局

QFormLayout 表单就像一个只有两列的表格,非常适合填写注册表单这种类型的界面,如下所示

整体布局设置为垂直布局

可以看到一起缩放

这个界面太过简单,直接对整体设置了布局。一般复杂的界面要对里面的各个控件进行分组,分别对每一组进行布局设置,最后设置整体布局。

调整控件大小和位置

调整layout中控件的大小比例

可以通过设定控件的sizePolicy来调整

比如要将上面程序的统计按钮缩小,通过设置sizePolicy里的水平策略值为Fixed

居中操作

由于要对控件设置布局需要至少两个控件一起,而这里只有一个控件。可以先创建一个水平布局区域,通过拖拽。

拖拽后的那个区域由于还没有任何控件,那个区域就只显示为一条线,控件无法拖进里面。

这时可将控件拖到那个区域所对应的对象里面

调整比例大小,(直接贴上教程里的图),通过设置水平伸展可以调整三个控件水平的比例大小

 调整控件间距

要调整控件上下间距,可以给控件添加layout,然后通过设定layout的上下的padding 和 margin 来调整间距。

要调整控件的左右间距,可以通过添加 horizontal spacer 进行控制,也可以通过layout的左右margin

(教程里的图)

 界面布局步骤建议

  • 先不使用任何Layout,把所有控件 按位置 摆放在界面上
  • 然后先从 最内层开始 进行控件的 Layout 设定
  • 逐步拓展到外层 进行控件的 Layout设定
  • 最后调整 layout中控件的大小比例, 优先使用 Layout的 layoutStrentch 属性来控制