[花果山水帘洞] python3学习笔记(6)——PyQt5

玩编程,当然不会只写CLI。

python3学习笔记(6)——PyQt5

2017-06-23 / vc12345679

由头

以前写GUI程序,windows下基本用c#,linux下基本用qt,现在开始玩python了,少不得用python也尝尝鲜。

python写GUI有很多选择,弱水3k,只取1瓢,看pyqt被提及得不少,得,就它了。

使用方式

用pyqt写也有很多选择,比如手动写qml文件;又或者用qt designer写出ui文件,再在py文件里用uic加载; 当然最容易理解的方式还是qt designer写出ui,用pyuic(ui converter)转换成py,在需要的地方import即可。

三种办法会一种也就足够了,所以不动脑子的某人直接就第三种了。

使用过程

生成UI

qt designer 做界面,跟以前用qt没有任何区别,生成的ui文件通过pyuic顺利生成py。 生成的py中,ui类以 “Ui_” 为前缀命名。

实现逻辑

生成UI后,就要开始码代码实现逻辑功能了。 跟其它面向对象的语言类似,pyqt的逻辑功能部分一般也是打包在窗体类里。

在窗体类的构造函数里,需要做的有三样:

  1. 初始化UI
  2. 声明qt中最为经典的signal/slot关系
  3. 成员变量构造及赋值

运行方式

实例化上面的窗体类,通过 PyQt5.QtWidgets.QApplication 类的 exec() 方法就可以运行了。

示例

以一个PyQt5的QMainWindow为例,用designer和pyuic生成了一个Ui_MainWindow类,保存在mainwindow.py里。

主函数放在main.py里,其内容为:

from mainwindow import Ui_MainWindow
from PyQt5.QtWidgets import QMainWindow, QApplication
import sys

# 定义一个窗体类,不妨叫MainWindow,继承自PyQt5.QtWidgets.QMainWindow
# 为了偷懒,同时也继承了UI类Ui_MainWindow
class MainWindow(QMainWindow, Ui_MainWindow):

    # 窗体类构造函数
    def __init__(self):

        # 调用父类构造函数
        super(MainWindow, self).__init__()

        # 初始化UI
        self.setupUi(self)

        # 连接相应的signal/slot
        # 以UI中一个名为pushButton的按钮的单击signal为例,连接到一个自定义的(槽)函数add()
        self.pushButton.clicked.connect(self.add)

    # 自定义的一个槽函数
    def add(self):
        # 实现相关功能,略
        pass


def main():
    app = QApplication(sys.argv)
    # 实例化窗体
    mainwindow = MainWindow()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()

总结

整个过程的逻辑还是很清晰的

  1. 设计UI
  2. 编写窗体类
    1. 初始化UI
    2. 实现逻辑功能
  3. 实例化并运行

Hint 在windows下,可将main.py的后缀名改为.pyw, pyw文件默认由pythonw.exe运行,这样可以使得运行pyqt5的GUI程序时隐藏控制台。