python-pyqt5使用

开发桌面小应用, ui 可视化编辑 + 脚本逻辑 无疑爽的一批.


前篇


安装

  1. 安装 pyqt5pyqt5-tools 这两个库

    1
    2
    $ pip3 install pyqt5
    $ pip3 install pyqt5-tools
  2. 安装完后, 在 python 安装目录下可以找到可执行程序 Lib\site-packages\pyqt5_tools\Qt\bin\designer.exe, 但是点击打开会弹窗错误: this application failed to start..., 原因是找不到相关 windows 库.

    解决办法: 将 Lib\site-packages\PyQt5\Qt\pluginsplatforms 目录拷贝到 Lib\site-packages\pyqt5_tools\Qt\bin 下覆盖. 然后就可以打开 designer.exe. (参考: https://stackoverflow.com/questions/61324972/pyqt5-designer-is-not-working-this-application-failed-to-start-because-no-qt-pl)


pycharm 配置

参考: https://blog.csdn.net/mawei7510/article/details/81450032

配置快捷打开 designer.exe 和 生成 xxx.ui 对应的 py 工具

  1. 添加 designer.exe

  2. 添加 xxx.ui 对应的 py 工具

    • workding directory: 是指执行命令的地方, 这里我指定到一个 generate 目录

    • 测试一下

      最终执行的命令: D:\Python38-32\Scripts\pyuic5.exe -o test.py F:\a_link_workspace\python\pyqt5-gui\ui\test.ui


hello world 初探

  1. 使用默认的模板, 导出为布局文件 test.ui

  2. 生成对应的 python 代码.

    代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    # -*- coding: utf-8 -*-

    from PyQt5 import QtCore, QtGui, QtWidgets

    class Ui_Dialog(object):
    def setupUi(self, Dialog):
    Dialog.setObjectName("Dialog")
    Dialog.resize(400, 300)
    self.buttonBox = QtWidgets.QDialogButtonBox(Dialog)
    self.buttonBox.setGeometry(QtCore.QRect(290, 20, 81, 71))
    self.buttonBox.setOrientation(QtCore.Qt.Vertical)
    self.buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.Cancel | QtWidgets.QDialogButtonBox.Ok)
    self.buttonBox.setObjectName("buttonBox")

    self.retranslateUi(Dialog)
    self.buttonBox.accepted.connect(Dialog.accept) # Dialog.accept 就是按钮 ok 绑定的方法, 要自己实现
    self.buttonBox.rejected.connect(Dialog.reject) # Dialog.reject 就是按钮 cancel 绑定的方法, 要自己实现
    QtCore.QMetaObject.connectSlotsByName(Dialog)

    def retranslateUi(self, Dialog):
    _translate = QtCore.QCoreApplication.translate
    Dialog.setWindowTitle(_translate("Dialog", "Dialog"))
  3. 编写入口 main.py

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    # -*- coding: utf-8 -*-

    import os
    import sys
    from PyQt5 import QtCore, QtGui, QtWidgets
    from generate import test


    # 自定义逻辑, 继承 QtWidgets.QWidget
    class CLogin(QtWidgets.QWidget):
    def __init__(self):
    QtWidgets.QWidget.__init__(self)

    # ok 按钮
    def accept(self):
    print("--- hello accept")

    # cancel 按钮
    def reject(self):
    print("--- hello reject")


    if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)
    widget = CLogin() # 实例化 自定义逻辑
    ui = test.Ui_Dialog()
    ui.setupUi(widget)
    widget.show()
    sys.exit(app.exec_())

    执行 main.py

    1
    $ python3 main.py