一、PyQt5 应用开发基础

第1章 开发环境搭建

在pycharm中进行GUI程序开发,搭建pyqt5的开发环境

1.pyqt5模块

pip install pyqt5

pyqt5不再提供QtDesigner等工具,需要再安装pyqt5-tools

pip install pyqt5-tools

2.配置QtDesigner

image-20220529155947171

需要填写的说明:

Name:QtDesinger

Program:…\Lib\site-packages\qt5_applications\Qt\bin\designer.exe

Working directory:$ProjectFileDir$

意思是该外部工具定义名称为QtDesinger,外部工具的地址需要自己手动选择,一般为在Python的安装路径中,最后的Working directory设置为当前项目工作目录即可,即创建的UI文件会存储在目录下。

3.配置PyUIC

image-20220529160224239

Name:PyUIC

Program:E:\ProgramData\Anaconda3\envs\robotUI\python.exe

Arguments:-m PyQt5.uic.pyuic $FileName$ -o $FileNameWithoutExtension$.py

Working directory:$ProjectFileDir$

意思是该外部工具定义名称为PyUIC,外部工具的地址需要自己手动选择,一般为在Python的安装路径中,Arguments的意思是会把UI文件转成同名的py文件,最后的Working directory设置为当前项目工作目录即可。

第2章 PyQt5 GUI 程序框架

2.1 pyqt5 GUI程序的基本框架
2.2可视化设计窗体GUI程序
  1. 在QT Designer中可视化设计窗体

  2. 使用pyUIC将窗体文件转换为python程序文件

  3. 使用转换后的窗体python类构建GUI应用程序

  4. 界面与逻辑分离的GUI程序框架

    • 多继承方法

      ## appMain2.py 多继承方法 
      import sys from PyQt5.QtWidgets
      import QWidget, QApplication
      from ui_FormHello import Ui_FormHello

      class QmyWidget(QWidget,Ui_FormHello):
      def __init__(self, parent=None):
      super().__init__(parent) #调用父类构造函数,创建QWidget窗体
      self.Lab="多重继承的QmyWidget" #新定义的一个 变量
      self.setupUi(self) #self是QWidget窗体,可作 为参数传给setupUi()
      self.LabHello.setText(self.Lab)
      if __name__ == "__main__":
      app = QApplication(sys.argv) #创建app
      myWidget=QmyWidget()
      myWidget.show()
      myWidget.btnClose.setText("不关闭了")
      sys.exit(app.exec_())
      • 采用多继承的方式定义了一个类QmyWidget, 称这个类为窗体的业务逻辑类,它的父类是QWidget和 Ui_FormHello。

      • 在这个类的构造函数中,首先用函数super() 获取父类,并执行父类的构造函数

      • 调用setupUi()函数创建UI窗体

        优点是访问方便,缺点是过于开放,不符合面向对象严格封装的设计思想,不利于界面与业务逻辑分离的。

    • 单继承与界面独立封装方法

      ## appMain.py 单继承方法,能更好地进行界面与逻辑的分离 
      import sys from PyQt5.QtWidgets
      import QWidget, QApplication
      from ui_FormHello import Ui_FormHello
      class QmyWidget(QWidget):
      def __init__(self, parent=None):
      super().__init__(parent) #调用父类构造函 数,创建QWidget窗体
      self.__ui=Ui_FormHello() #创建UI对象
      self.__ui.setupUi(self) #构造UI
      self.Lab="单继承的QmyWidget"
      self.__ui.LabHello.setText(self.Lab)
      def setBtnText(self, aText):
      self.__ui.btnClose.setText(aText)
      if __name__ == "__main__":
      app = QApplication(sys.argv) #创建app,用 QApplication类
      myWidget=QmyWidget()
      myWidget.show()
      myWidget.setBtnText("间接设置")
      sys.exit(app.exec_())
      • 可视化设计的窗体对象被定义为QmyWidget类 的一个私有属性self.__ui,在QmyWidget类的内部对窗体上的组件的访问都通过这个属性实现,而外部无法直接访问窗体上的对象,这更符合面向对象封装隔离的设计思想。

      • 窗体上的组件不会与QmyWidget里定义的属性 混淆。

      • 当然,也可以定义界面对象为公共属性,即创建界面对象时用下面的语句:

        self.ui=Ui_FormHello() 
2.3信号和槽的使用

**信号(Signal)**就是在特定情况下被发射(emit) 的一种通告,例如一个PushButton按钮最常见的信号就是鼠标单击时发射的clicked()信号,一个ComboBox最常见的信号是选择的项变化时发射的 CurrentIndexChanged()信号。GUI程序设计的主要内容就是对界面上各组件发射的特定信号进行响应,只需要知道什么情况下发射了哪些信号,然后合理地去响应和处理这些信号就可以了。

槽(Slot)就是对信号响应的函数。槽实质上是一个函数,它可以被直接调用。槽函数与一般的函数不同的是:槽函数可以与一个信号关联,当信号被发射时,关联的槽函数会被自动执行。Qt的类一般都有一些内建(build-in)的槽函数,例如QWidget有一个槽函数close(),其功能是关闭窗口。如果将一个PushButton 按钮的clicked()信号与窗体的close()槽函数关联,那么点击按钮时就会关闭窗口。

2.4自定义信号的使用

二、PyQt5 GUI应用程序设计

第3章 常用 界面组件的使用

第4章 Model/View结构

第5章 事件处理

第6章 对话框与多窗口设计

第7章 数据库

第8章 绘图

第9章 文件

第10章 多媒体

第11章 GUI设计增强技术

三、数据可视化

第12章 PyQtChart二维绘图

第13章 PyQtDataVisualization三维绘图

第14章 Matplotlib数据可视化