二、PyQt5 之 界面设计(布局、尺寸、控件关系,信号与槽、添加菜单与工具栏)
Vertical Layout: 垂直布局
Horizontal Layout: 水平布局
Grid Layout: 网格布局
Form Layout: 表单布局
Containers: 容器
二、水平布局
2.1 方式一
2.1.1 设置方式
import sys import Horizontal_Layout from PyQt5.QtWidgets import QApplication, QMainWindow if __name__ == '__main__': # 创建一个QApplication类的实例 app = QApplication(sys.argv) # sys.argv 是用来获取命令行参数 # 创建主窗口 mainWindow = QMainWindow() # 调用生成的界面的python文件 ui = Horizontal_Layout.Ui_MainWindow() # 向主窗口中添加控件 ui.setupUi(mainWindow) # 显示窗口 mainWindow.show() sys.exit(app.exec_())
调用生成的界面与Qt中预览的界面是一样的。
三、垂直布局
栅格布局是将一定对应的组件,按照特定的二维格式进行合并,以使用栅格布局搭建计算器数字按键区为例来展示栅格布局的结构。
同时,下图的栅格布局还可以继续添加行列那样的按钮之类的组件。
表单布局是在实际中应用十分广泛的一种布局方式,我们在登录时候输入账号密码的时候就是表单布局。
注意:在选择布局中是 在窗体布局中布局,没有表单布局这个选项。 如果直接先脱宅表单布局另当别论,先选择组件再设计布局的时候要注意
九、控件尺寸
9.1 空间尺寸的最大值和最小值
9.2 尺寸策略(sozepolicy)
9.2.1 读取期望尺寸
# sizeHint() 期望尺寸 # 读取 button 的期望尺寸 宽度和高度 print(self.pushButton.sizeHint().width()) print(self.pushButton.sizeHint().height())
1. 创建表单组件,并添加内容(以表单组件为例),在标签的内容后加括号(&+对应键位)表示该标签对应的热键为 alt + 对应键位。
2. 工具栏 Edit --> 编辑伙伴
3. 依次从左往右拖动鼠标,将 label 标签与 Line edit标签绑定,即出现连接的箭头
4. 工具栏 Edit --> 编辑窗口组件
5. 保存生成 .ui 文件,并生成对应的 .py 文件, 再继续调用这个 .py 文件
6. 出现的界面中,标签后面的 & 不见了, 然后输入 alt + A/B/C会依次鼠标调用到 后面对应的 Line edit组件中。
# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'Horizontal_Layout.ui' # # Created by: PyQt5 UI code generator 5.15.4 # # WARNING: Any manual changes made to this file will be lost when pyuic5 is # run again. Do not edit this file unless you know what you are doing. from PyQt5 import QtCore, QtGui, QtWidgets class Ui_MainWindow(object): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(995, 855) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Preferred) sizePolicy.setHorizontalStretch(2) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(MainWindow.sizePolicy().hasHeightForWidth()) MainWindow.setSizePolicy(sizePolicy) self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") self.formLayoutWidget = QtWidgets.QWidget(self.centralwidget) self.formLayoutWidget.setGeometry(QtCore.QRect(210, 200, 491, 151)) self.formLayoutWidget.setObjectName("formLayoutWidget") self.formLayout = QtWidgets.QFormLayout(self.formLayoutWidget) self.formLayout.setContentsMargins(0, 0, 0, 0) self.formLayout.setObjectName("formLayout") self.lineEdit = QtWidgets.QLineEdit(self.formLayoutWidget) self.lineEdit.setObjectName("lineEdit") self.formLayout.setWidget(0, QtWidgets.QFormLayout.FieldRole, self.lineEdit) self.label_2 = QtWidgets.QLabel(self.formLayoutWidget) self.label_2.setObjectName("label_2") self.formLayout.setWidget(1, QtWidgets.QFormLayout.LabelRole, self.label_2) self.lineEdit_2 = QtWidgets.QLineEdit(self.formLayoutWidget) self.lineEdit_2.setObjectName("lineEdit_2") self.formLayout.setWidget(1, QtWidgets.QFormLayout.FieldRole, self.lineEdit_2) self.label_3 = QtWidgets.QLabel(self.formLayoutWidget) self.label_3.setObjectName("label_3") self.formLayout.setWidget(2, QtWidgets.QFormLayout.LabelRole, self.label_3) self.lineEdit_3 = QtWidgets.QLineEdit(self.formLayoutWidget) self.lineEdit_3.setObjectName("lineEdit_3") self.formLayout.setWidget(2, QtWidgets.QFormLayout.FieldRole, self.lineEdit_3) self.label = QtWidgets.QLabel(self.formLayoutWidget) self.label.setObjectName("label") self.formLayout.setWidget(0, QtWidgets.QFormLayout.LabelRole, self.label) MainWindow.setCentralWidget(self.centralwidget) self.menubar = QtWidgets.QMenuBar(MainWindow) self.menubar.setGeometry(QtCore.QRect(0, 0, 995, 26)) self.menubar.setObjectName("menubar") MainWindow.setMenuBar(self.menubar) self.statusbar = QtWidgets.QStatusBar(MainWindow) self.statusbar.setObjectName("statusbar") MainWindow.setStatusBar(self.statusbar) self.label_2.setBuddy(self.lineEdit_2) self.label_3.setBuddy(self.lineEdit_3) self.label.setBuddy(self.lineEdit) self.retranslateUi(MainWindow) QtCore.QMetaObject.connectSlotsByName(MainWindow) def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow")) self.label_2.setText(_translate("MainWindow", "年龄(&B):")) self.label_3.setText(_translate("MainWindow", "职位(&C):")) self.label.setText(_translate("MainWindow", "姓名(&A):")) # setBuddy() 函数表示建立伙伴
在主界面中随机创建 一些 Line edit组件和 Combo Box组件,当预览的时候,鼠标会默认聚焦在第一个我们创建的组件中等待输入。使用 Tab 会根据我们创建的顺序来依次跳转。
修改 Tab 的顺序:
1. 工具栏 Edit --> 编辑 Tab 顺序。
2. 然后依次点击想要更改后的标签顺序,如下图。
3. 工具栏 Edit --> 编辑窗口组件
4. 再次预览的时候,使用 Tab就会按照我们设置的顺序来。
十二、信号与槽(Qt、PyQt的核心机制)
12.1 什么是信号与槽
信号: 是由对象或控件发射出去的消息。
比如:按钮的单击事件,当单击按钮时,按钮就会向外部发送单击的消息,这些发送出去的信号需要一些代码来拦截,这些代码就是槽。
槽:本质上是一个函数或方法。信号可以理解为事件;槽可以理解为事件函数。
需要将信号和槽绑定:一个信号可以和多个槽绑定, 一个槽可以拦截多个信号。
绑定的过程可以在可视化界面完成,也可以在代码中实现(后面介绍)。
12.2 绑定信号与槽
1. 添加button组件
2. 工具栏 Edit --> 编辑信号/槽
3. 拖动组件产生 "接地" 符号
4. 选中需要的函数(方法)
5. 保存 OK
6. 工具栏 Edit --> 编辑窗口部件
7. 预览
8. 点击组件,预览消失
十三、为窗口添加菜单和工具栏
13.1 页面布局显示



































浙公网安备 33010602011771号