第一章 认识PyQt5
1.1PyQt框架简介
- GUI:Graphical User Interface
- 常用的GUI控件集:PyQt,Tkintert,Kivy,PyGUI,Libavg
- Qt使用一种称为信号与槽的机制在窗口控件之间传递事件和信息,这种机制不同于其他图像界面开发使用的回溯(callback)机制.
- PyQt5向下不兼容PyQt4
第3章 QtDesigner的使用
3.1Qt Designer快速入门
- 生成以后
.ui的文件(本质上是xml格式),可以直接被python文件调用,也可以转换为.py文件在被调用.
3.1.2 窗口主要区域介绍
Widget Box:工具箱- 对象查看器:可以看到主窗口放置的对象列表
- 属性编辑器:可以对窗口,控件,布局的属性进行编辑
objectName:控件对象名字geometry:相对坐标系sizePolicy:控件大小策略minimumSize,maximumSize:如果想让窗口或者空间的大小固定,则可以将这两个属性设置为一样的值
- 信号/槽编辑器
- 资源浏览器:可以为空间添加图片,比如Label,Button的背景图片
3.1.4将.ui文件转换为.py文件
- 配置Pycharm进行文件转换:
nowcoder.com/discuss/389157779360034816
3.1.5 界面与逻辑分离
- 我们将这种有.ui文件编译而来的.py文件称为界面文件.由于界面文件每次编译时都会初始化,所以需要新建一个.py文件调用界面文件,这个新建的py文件称为逻辑文件,也可以称为业务文件.实现
显示与业务逻辑的分离
实现分离的方法:新建一个类并继承界面文件的主窗口,完整代码如下:
python
import sys
from PyQt5.QtWidgets import QApplication,QMainWindow
from firstMainWin import *
class MyMainWindow(QMainWindow,Ui_MainWindow):
def __init__(self,parent=None):
super(MyMainWindow, self).__init__(parent)
self.setupUi(self)
if __name__ == '__main__':
app = QApplication(sys.argv)
myWin = MyMainWindow()
myWin.show()
sys.exit(app.exec_())
当以后修改界面时,只需修改界面文件即可,而逻辑文件不需做太多改变
3.2布局管理入门
4种窗口布局方式:
- Vertical Layout
- Horizonaltal Layout
- Grid Layout
- Form Layout
布局的2中方式:
- 通过布局管理器进行布局
- 通过容器控件布局:使用左侧Containers进行布局,本质上还是使用布局管理器进行布局.
3.3Qt Designer实战应用
3.3.1绝对布局
- geometry属性
- X
- Y
- 宽度
- 高度
3.3.2使用布局管理器布局
1.垂直布局
- 一般建议为方便管理,尽量是排列成完整的排和列,缺的部分可以使用空间Label补充
- Label控件一般不需要进行重新命名,他只是起到显示名字的作用.
- 当使用完布局管理器之后,属性编辑器中看到的4个标签的geometry属性变成灰色不能使用,这说明这些标签的位置和大小已经有垂直布局管理器接管.
2.网格布局
3.水平布局
- Spacers栏:
- Vertical Spacer:表示两个布局管理器不要彼此挨着,否则视觉效果不好
- Horizontal Spacer:表示开始按钮应该与栅格布局管理器尽可能离得远一些,
- Horizontal Line:表示两边的布局管理器不是同一个类别,用一条线把他们分开
- Spacer中的属性
sizeTypesizeHint
即希望Spacer窗口控件希望sizeType到尺寸提示sizeHint的尺寸
- 主窗口的所有窗口控件都有自己的父类
4.minmumSize和maximumSize属性
- 设置之后如果想返回到原来的默认设置,可以在QObject控件的名字最右侧点击.
5.sizePolicy属性
- 每个窗口创建都有属于自己的两个属性,
sizeHint(尺寸提示):期望尺寸minimumSize(最小尺寸):能够被压缩的最小尺寸
- sizePolicy的作用:如果窗口控件在布局管理器中的布局不能满足我们的需要,那么可以设置该窗口控件的sizePolicy来实现布局的微调.不同控件的sizePolicy可能不同.
水平策略:Fixed:窗口控件具有其sizeHint所提示的尺寸且尺寸不会再改变

注意:Minimum指的是窗口尺寸不能低于sizeHint所提示的尺寸,Maximu同理
- 垂直伸展:按比例放缩
- 水平伸展:按比例放缩
3.3.3 其他注意的内容
1.Qt Designer布局的顺序


2.使用布局管理器对窗体进行布局
- 使用布局管理器对窗体进行布局是针对整个窗体的,在窗体空白处单击,然后单击鼠标右键,但弹出的快捷菜单中选择
布局进行选择即可.
3.设置伙伴关系
- 设置
Alt+某键,即设置当触发快捷键时,光标会立刻定位到与Display Widgets有伙伴关系的Input Widgets上,设置伙伴关系只对英文名字的Display Widgets有效. - 步骤
- 将Display Widgets的名字前加上
& - 点击
Edit中的设置伙伴关系 - 然后在Display Widgets中引出箭头到对应的input Widgets中
- 将Display Widgets的名字前加上
4.设置Tab键的次序
- 在edit->编辑Tab顺序
- 在编辑菜单中选择了'编辑Tab顺序'后,在窗体中任意处单击鼠标右键,然后选择制表符顺序表.
3.3.4测试程序
python
from PyQt5.QtCore import pyqtSlot
from PyQt5.QtWidgets import QMainWindow, QApplication
from Ui_layout_demo_LayoutManage import Ui_LayoutDemo
class LayoutDemo(QMainWindow, Ui_LayoutDemo):
def __init__(self, parent=None):
super(LayoutDemo, self).__init__(parent)
self.setupUi(self)
@pyqtSlot()
def on_pushButton_clicked(self):
"""
Slot documentation goes here.
"""
print('收益_min:', self.doubleSpinBox_returns_min.text())
print('收益_max:', self.doubleSpinBox_returns_max.text())
print('最大回撤_min:', self.doubleSpinBox_maxdrawdown_min.text())
print('最大回撤_max:', self.doubleSpinBox_maxdrawdown_max.text())
print('sharp比_min:', self.doubleSpinBox_sharp_min.text())
print('sharp比_max:', self.doubleSpinBox_sharp_max.text())
if __name__ == "__main__":
import sys
app = QApplication(sys.argv)
ui = LayoutDemo()
ui.show()
sys.exit(app.exec_())
python
@pyqtSlot()
def on_pushButton_clicked(self):
利用Eric的生成对话框代码的功能,他是Eric在逻辑文件上建立信号与槽连接的方式.
3.4信号与槽关联
- 当信号发射时,连接的槽函数将会自动执行.
- 信号与槽通过
QObject.signal.connect()连接 - 所有从QObject类或其子类(如QWidget)派生的类都能够包含信号与槽.
- 多个信号与单个槽进行连接,单个信号也可以与多个槽进行连接.
- 为控件发射的信号指定的对应的处理槽函数的3种方法
- 在窗口的UI设计中操作添加信号与槽
- 通过代码连接信号与槽
- 通过Eric的
生成对话框代码的功能产生信号与槽
3.4.1简单入门
点击关闭窗口按钮,窗口关闭
- 修改按钮的text属性和objecName属性
- text属性:是在按钮显示的文字
- objectName:是按钮对象的名字
- 点击edit中的编辑信号与槽
- 引出直线,选择信号与槽.
生成的窗口代码
python
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_Form(object):
def setupUi(self, Form):
Form.setObjectName("Form")
Form.resize(400, 300)
self.closeWinBtn = QtWidgets.QPushButton(Form)
self.closeWinBtn.setGeometry(QtCore.QRect(80, 50, 75, 23))
self.closeWinBtn.setObjectName("closeWinBtn")
self.retranslateUi(Form)
self.closeWinBtn.clicked.connect(Form.close) # type: ignore #connect中的函数不能带括号
QtCore.QMetaObject.connectSlotsByName(Form) # 信号与槽的高级引用,可有可无
def retranslateUi(self, Form):
_translate = QtCore.QCoreApplication.translate
Form.setWindowTitle(_translate("Form", "Form"))
self.closeWinBtn.setText(_translate("Form", "关闭窗口"))
调用窗口的代码:
python
import sys
from PyQt5.QtWidgets import QApplication,QMainWindow
from MainWinSignalSlog01 import Ui_Form
class MyMainWindow(QMainWindow,Ui_Form):
def __init__(self,parent=None):
super(MyMainWindow, self).__init__(parent)
self.setupUi(self)
if __name__ == '__main__':
app = QApplication(sys.argv)
myWin = MyMainWindow()
myWin.show()
sys.exit(app.exec_())