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_())
相关推荐
Dovis(誓平步青云)3 分钟前
《QT学习第四篇:常见事件与UDP、TCP、文件系统、(锁、信号量、条件变量》
c语言·开发语言·汇编·qt
isyangli_blog8 小时前
OpenDayLight (Carbon 版本) 启动与组件安装
开发语言·php
vb2008119 小时前
FastAPI APIRouter
开发语言·python
Benszen9 小时前
KVM虚拟化解决方案
开发语言·perl
会编程的土豆9 小时前
Go 语言反射(Reflection)详解
开发语言·后端·golang
東雪木9 小时前
多线程与并发编程 专属复习笔记
java·开发语言·笔记·java面试
杨充9 小时前
1.3 浮点型数据设计灵魂
开发语言·python·算法
噜噜噜阿鲁~9 小时前
python学习笔记 | 11.3、面向对象高级编程-多重继承
java·开发语言
basketball6169 小时前
Go 语言从入门到进阶:4. 数组和MAP使用方法总结
开发语言·后端·golang
春生野草10 小时前
反射、Tomcat执行
java·开发语言