PyQt5的安装配置

ubuntu 18.04 LTS 下安装配置 PyQt5

1. 安装相关的库

如果先安装了 miniconda, 卸载 miniconda, 在安装了 PyQt5 之后再重新安装 miniconda, 否则有兼容性问题无法启动 spyder, 报错:

ModuleNotFoundError: No module named 'PyQt5.QtWebKitWidgets'

假设为某个激活的 conda 环境安装 PyQt5(可以为默认环境), 在该环境下:

- pip install  PyQt5 -i https://pypi.tuna.tsinghua.edu.cn/simple   
- pip install PyQt5-stubs  -i https://pypi.tuna.tsinghua.edu.cn/simple
- sudo apt-get install qttools5-dev-tools // 安装 Qtdesigner
- sudo apt-get install qt5-default
- sudo apt install pyqt5-dev-tools  // 安装 pyqt5 工具 pyuic

2. 为 PyCharm 配置 PyQt5

为 PyCharm 添加快捷使用的拓展工具 Qt designer:

File ---> Settings ---> Tools ---> External Tools ---> 
add(Alt + Insert),Working directory: 工作路径,设置为 $ProjectFileDir$

同样,为 PyCharm 添加将 Qt 的 ui 文件转换为 python 程序的 PyUIC 工具:

- name----PyUIC
- Arguments----$FileName$ -o $FileNameWithoutExtension$.py
- Working dirctory----$ProjectFileDir$

回到 pycharm 主界面菜单,Tools ---> External Tools 下会出现 Qt designer 和 pyUIC 两个子菜单。

使用 Qt designer 做一个登录界面 Demo, 并将对应文件 login.ui 保存到项目目录下:

右键 login.ui, External Tools ---> pyUIC, 会将 .ui 文件转为 .py 文件 login.py, 实际上是一个 Ui_Form 类:

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'login.ui'
#
# Created by: PyQt5 UI code generator 5.10.1
#
# WARNING! All changes made in this file will be lost!

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(316, 202)
        self.widget = QtWidgets.QWidget(Form)
        self.widget.setGeometry(QtCore.QRect(50, 40, 242, 130))
        self.widget.setObjectName("widget")
        self.gridLayout = QtWidgets.QGridLayout(self.widget)
        self.gridLayout.setContentsMargins(0, 0, 0, 0)
        self.gridLayout.setObjectName("gridLayout")
        self.label = QtWidgets.QLabel(self.widget)
        self.label.setObjectName("label")
        self.gridLayout.addWidget(self.label, 0, 0, 1, 1)
        self.lineEdit = QtWidgets.QLineEdit(self.widget)
        self.lineEdit.setObjectName("lineEdit")
        self.gridLayout.addWidget(self.lineEdit, 0, 1, 1, 2)
        self.label_2 = QtWidgets.QLabel(self.widget)
        self.label_2.setObjectName("label_2")
        self.gridLayout.addWidget(self.label_2, 1, 0, 1, 1)
        self.lineEdit_2 = QtWidgets.QLineEdit(self.widget)
        self.lineEdit_2.setObjectName("lineEdit_2")
        self.gridLayout.addWidget(self.lineEdit_2, 1, 1, 1, 2)
        self.checkBox = QtWidgets.QCheckBox(self.widget)
        self.checkBox.setObjectName("checkBox")
        self.gridLayout.addWidget(self.checkBox, 2, 0, 1, 2)
        self.pushButton_2 = QtWidgets.QPushButton(self.widget)
        self.pushButton_2.setObjectName("pushButton_2")
        self.gridLayout.addWidget(self.pushButton_2, 3, 0, 1, 2)
        self.pushButton = QtWidgets.QPushButton(self.widget)
        self.pushButton.setObjectName("pushButton")
        self.gridLayout.addWidget(self.pushButton, 3, 2, 1, 1)

        self.retranslateUi(Form)
        QtCore.QMetaObject.connectSlotsByName(Form)

    def retranslateUi(self, Form):
        _translate = QtCore.QCoreApplication.translate
        Form.setWindowTitle(_translate("Form", "Form"))
        self.label.setText(_translate("Form", " 用户名:"))
        self.label_2.setText(_translate("Form", " 密码:"))
        self.checkBox.setText(_translate("Form", " 记住用户名和密码 "))
        self.pushButton_2.setText(_translate("Form", " 取消 "))
        self.pushButton.setText(_translate("Form", " 确定 "))

使用命令行也可以由 ui 文件生成 py 文件, 所以完全可以不安装 pycharm 这个资源大户 :

pyuic5 -o login.py  login.ui

添加如下代码:

if __name__=="__main__":
    import sys
    app=QtWidgets.QApplication(sys.argv)
    widget=QtWidgets.QWidget()
    ui=Ui_Form()
    ui.setupUi(widget)
    widget.show()
    sys.exit(app.exec_())

保存后运行 login.py,即可以看到之前设计的界面了。

用 PyQt5 写的第一个程序

1. 用 Qt Designer 创建界面

随便拖点部件并保存, 这里假设保存为 MainWindow.ui , 并用 PyUIC 生成对应的 python 文件 MainWindow.py

2. 创建 app 入口 python 文件 main.py

假设在项目文件夹下创建了图标文件夹 img, 并放入了 logo.png 作为窗体图标

import sys
import MainWindow
from PyQt5.QtWidgets import QApplication, QMainWindow
from PyQt5.QtGui import QIcon

class AppWindow(QMainWindow,MainWindow.Ui_MainWindow):
    # 继承了 Ui_MainWindow 类,使用其构造方法构造主窗口
    def __init__(self,parent=None):
        # super() 方法返回了 AppWindow 类的父类对象,并且调用了父类的构造方法
        # __init__() 方法是 Python 语言中的构造方法。super(AppWindow,self).__init__(parent)
        self.setupUi(self)
        # 窗口图标
        self.setWindowIcon(QIcon("img/logo.png"))


if __name__ == '__main__':
    # 定义程序的入口,通过创建 QApplication 对象来创建 Qt 窗口
    app = QApplication(sys.argv)
    appWindow = AppWindow()
    appWindow.show()
    # 应用进入主循环, 事件处理开始执行
    # 主循环用于接收来自窗口触发的事件,并且转发他们到 widget 应用上处理
    # 如果调用 exit() 方法或主 widget 组件被销毁,主循环将退出
    # sys.exit() 方法确保一个不留垃圾的退出。系统环境将会被通知应用是怎样被结束的。# exec_() 方法有一个下划线。因为 exec 是 Python 保留关键字。因此,用 exec_() 来代替。sys.exit(app.exec_())

3. 打包

安装 pyinstaller:

conda install pyinstaller 

编译:

pyinstaller  -F main.py 

可能的报错信息:

Exception:
            Cannot find existing PyQt5 plugin directories
            Paths checked: c:/qt/qt_1533082737779/_h_env/Library/plugins

创建错误提示中的目录 c:/qt/qt_1533082737779/_h_env/Library/plugins, 把类似 C:\Miniconda3\Lib\site-packages\pyqt5_tools\plugins 下的 pyqt5qmlplugin.dll 拷贝到该目录下, 重新打包, 在 dist 目录下会生成 main.exe. 运行该程序可能的错误信息:

This application failed to start because it could not find or load the Qt platform plugin "windows"
in "".

Reinstalling the application may fix this problem.

拷贝类似 C:\Miniconda3\Library\plugins 下的 platforms 文件夹到可执行文件的文件夹下即可。

运行如下命令添加图标报错:

pyinstaller  -F main.py -i favicon.ico  --noconsole
struct.error: unpack requires a buffer of 16 bytes

参考 https://blog.csdn.net/u010000209/article/details/18762445 生成 ico, 重新打包。

这样生成的 app 有图标了, 但是 img 下的 png 图片并没有显示, 拷贝 img 文件夹到 main.exe 同一目录即可。

其他

解决在安装 PyQt5 后 spyder 不能输入中文的问题:

cp /usr/lib/x86_64-linux-gnu/qt5/plugins/platforminputcontexts/libfcitxplatforminputcontextplugin.so  ~/miniconda3/lib/python3.7/site-packages/PyQt5/Qt/plugins/platforminputcontexts

卸载 pycharm:

sudo snap list
sudo snap remove pycharm-community
评论(没有评论)