PyQt5快速开发与实战 第3章 QtDesigner

第一章 认识PyQt5

1.1PyQt框架简介

  1. GUI:Graphical User Interface
  2. 常用的GUI控件集:PyQt,Tkintert,Kivy,PyGUI,Libavg
  3. Qt使用一种称为信号与槽的机制在窗口控件之间传递事件和信息,这种机制不同于其他图像界面开发使用的回溯(callback)机制.
  4. PyQt5向下不兼容PyQt4

第3章 QtDesigner的使用

3.1Qt Designer快速入门

  1. 生成以后.ui的文件(本质上是xml格式),可以直接被python文件调用,也可以转换为.py文件在被调用.

3.1.2 窗口主要区域介绍

  1. Widget Box:工具箱
  2. 对象查看器:可以看到主窗口放置的对象列表
  3. 属性编辑器:可以对窗口,控件,布局的属性进行编辑
    • objectName:控件对象名字
    • geometry:相对坐标系
    • sizePolicy:控件大小策略
    • minimumSize,maximumSize:如果想让窗口或者空间的大小固定,则可以将这两个属性设置为一样的值
  4. 信号/槽编辑器
  5. 资源浏览器:可以为空间添加图片,比如Label,Button的背景图片

3.1.4将.ui文件转换为.py文件

  1. 配置Pycharm进行文件转换:nowcoder.com/discuss/389157779360034816

3.1.5 界面与逻辑分离

  1. 我们将这种有.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.垂直布局
  1. 一般建议为方便管理,尽量是排列成完整的排和列,缺的部分可以使用空间Label补充
  2. Label控件一般不需要进行重新命名,他只是起到显示名字的作用.
  3. 当使用完布局管理器之后,属性编辑器中看到的4个标签的geometry属性变成灰色不能使用,这说明这些标签的位置和大小已经有垂直布局管理器接管.
2.网格布局
3.水平布局
  1. Spacers栏:
    • Vertical Spacer:表示两个布局管理器不要彼此挨着,否则视觉效果不好
    • Horizontal Spacer:表示开始按钮应该与栅格布局管理器尽可能离得远一些,
  2. Horizontal Line:表示两边的布局管理器不是同一个类别,用一条线把他们分开
  3. Spacer中的属性
    • sizeType
    • sizeHint
      即希望Spacer窗口控件希望sizeType到尺寸提示sizeHint的尺寸
  4. 主窗口的所有窗口控件都有自己的父类
4.minmumSize和maximumSize属性
  1. 设置之后如果想返回到原来的默认设置,可以在QObject控件的名字最右侧点击.
5.sizePolicy属性
  1. 每个窗口创建都有属于自己的两个属性,
    • sizeHint(尺寸提示):期望尺寸
    • minimumSize(最小尺寸):能够被压缩的最小尺寸
  2. sizePolicy的作用:如果窗口控件在布局管理器中的布局不能满足我们的需要,那么可以设置该窗口控件的sizePolicy来实现布局的微调.不同控件的sizePolicy可能不同.
  3. 水平策略:
    • Fixed:窗口控件具有其sizeHint所提示的尺寸且尺寸不会再改变

      注意:Minimum指的是窗口尺寸不能低于sizeHint所提示的尺寸,Maximu同理
  4. 垂直伸展:按比例放缩
  5. 水平伸展:按比例放缩

3.3.3 其他注意的内容

1.Qt Designer布局的顺序


2.使用布局管理器对窗体进行布局
  1. 使用布局管理器对窗体进行布局是针对整个窗体的,在窗体空白处单击,然后单击鼠标右键,但弹出的快捷菜单中选择布局进行选择即可.
3.设置伙伴关系
  1. 设置Alt+某键,即设置当触发快捷键时,光标会立刻定位到与Display Widgets有伙伴关系的Input Widgets上,设置伙伴关系只对英文名字的Display Widgets有效.
  2. 步骤
    • 将Display Widgets的名字前加上&
    • 点击Edit中的设置伙伴关系
    • 然后在Display Widgets中引出箭头到对应的input Widgets中
4.设置Tab键的次序
  1. 在edit->编辑Tab顺序
  2. 在编辑菜单中选择了'编辑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信号与槽关联

  1. 当信号发射时,连接的槽函数将会自动执行.
  2. 信号与槽通过QObject.signal.connect()连接
  3. 所有从QObject类或其子类(如QWidget)派生的类都能够包含信号与槽.
  4. 多个信号与单个槽进行连接,单个信号也可以与多个槽进行连接.
  5. 为控件发射的信号指定的对应的处理槽函数的3种方法
    • 在窗口的UI设计中操作添加信号与槽
    • 通过代码连接信号与槽
    • 通过Eric的生成对话框代码的功能产生信号与槽

3.4.1简单入门

点击关闭窗口按钮,窗口关闭

  1. 修改按钮的text属性和objecName属性
    • text属性:是在按钮显示的文字
    • objectName:是按钮对象的名字
  2. 点击edit中的编辑信号与槽
  3. 引出直线,选择信号与槽.
    生成的窗口代码
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_())
相关推荐
寻寻觅觅☆5 小时前
东华OJ-基础题-106-大整数相加(C++)
开发语言·c++·算法
l1t5 小时前
在wsl的python 3.14.3容器中使用databend包
开发语言·数据库·python·databend
赶路人儿6 小时前
Jsoniter(java版本)使用介绍
java·开发语言
ceclar1236 小时前
C++使用format
开发语言·c++·算法
码说AI7 小时前
python快速绘制走势图对比曲线
开发语言·python
Gofarlic_OMS7 小时前
科学计算领域MATLAB许可证管理工具对比推荐
运维·开发语言·算法·matlab·自动化
星空下的月光影子7 小时前
易语言开发从入门到精通:补充篇·网络爬虫与自动化采集分析系统深度实战·HTTP/HTTPS请求·HTML/JSON解析·反爬策略·电商价格监控·新闻资讯采集
开发语言
老约家的可汗7 小时前
初识C++
开发语言·c++
wait_luky7 小时前
python作业3
开发语言·python
消失的旧时光-19437 小时前
第十九课:为什么要引入消息队列?——异步系统设计思想
java·开发语言