PyQt5
一、PyQt5 应用开发基础
第1章 开发环境搭建
在pycharm中进行GUI程序开发,搭建pyqt5的开发环境
1.pyqt5模块
pip install pyqt5 |
pyqt5不再提供QtDesigner等工具,需要再安装pyqt5-tools
pip install pyqt5-tools |
2.配置QtDesigner
需要填写的说明:
Name:QtDesinger
Program:…\Lib\site-packages\qt5_applications\Qt\bin\designer.exe
Working directory:$ProjectFileDir$
意思是该外部工具定义名称为QtDesinger,外部工具的地址需要自己手动选择,一般为在Python的安装路径中,最后的Working directory设置为当前项目工作目录即可,即创建的UI文件会存储在目录下。
3.配置PyUIC
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程序
-
在QT Designer中可视化设计窗体
-
使用pyUIC将窗体文件转换为python程序文件
-
使用转换后的窗体python类构建GUI应用程序
-
界面与逻辑分离的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()槽函数关联,那么点击按钮时就会关闭窗口。