6. Qt环境搭建–PyQt5

PyQt5是Digia针对Qt5应用程序框架开发的一组Python绑定。 PyQt5由Riverbank Computing开发,其官方主页 点击这里

PyQt5被实现为一组Python模块,它具有620多个类和6000种功能和方法。 它是一个多平台工具包,可在所有主要操作系统(包括Unix,Windows和Mac OS)上运行。 PyQt5具备双重许可,开发人员可以在GPL和商业许可之间进行选择。

这一章主要介绍PyQt5的开发环境搭建,默认读者已经对python有所了解。 这是一个pyqt的教程,https://zetcode.com/gui/pyqt5/

6.1. Windows PyQt5 开发环境

6.1.1. python安装

Windows 直接去官网下载最新的 python安装包 并安装,

我目前的版本是 python 3.9,安装位置 D:Program FilesPythonPython39。

添加环境变量

Windows下python环境变量
1
2
D:\Program Files\Python\Python39\Scripts\
D:\Program Files\Python\Python39\
pyqt_windows001

验证 python 是否安装成功。

python -V
#或者
pip -V
pyqt_windows002

6.1.2. PySide2安装

PySide2是来自Qt for Python项目的官方Python模块 ,可访问完整的Qt 5.12+框架。

PySide2模块介绍:

https://wiki.qt.io/Qt_for_Python

https://pypi.org/project/PySide2/

PySide2安装

pip install PySide2
pyqt_windows003

安装完成,我们使用下面的代码来测试。 创建文件 pyqt5_hello.py,添加如下内容。

embed_qt_develop_tutorial_code/PyQt5/pyqt5_hello.py
1
2
3
4
5
6
7
8
import sys
from PySide2.QtWidgets import QApplication, QLabel

if __name__ == "__main__":
    app = QApplication(sys.argv)
    label = QLabel("hello pyqt5")
    label.show()
    sys.exit(app.exec_())

在控制台中执行下面的代码,我们就能看到一个label作为窗口显示hello pyqt5

python pyqt5_hello.py
pyqt_windows004

6.1.3. Qt Create 创建 python 工程

首先需要配置Qt Create中的python环境(Qt Create版本为4.14)

默认Qt Create会检测得到python安装的位置,如果默认设置错误我们可以手动修改。

  • Python 3.9 指向 python安装目录下的python.exe

  • Python 3.9 (Windowed) 指向 python安装目录下的pythonw.exe

  • Python from Path 指向 python安装目录下的python.exe

如下图所示:

pyqt_windows005

使用Qt Create创建Python项目

本章例程在 embed_qt_develop_tutorial_code/PyQt5/PyQt5_Creator

pyqt_windows006

编译运行程序

pyqt_windows007

当然我们也可以在控制台下执行 python main.py, 效果相同。

6.1.4. PyQt5 demo

当然我们也可以直接用文本来编辑py程序

首先编写一个名字为pyqt5_demo.py的PyQt5应用程序,它主要是用于测试显示、触摸、信号、槽函数、 以及PyQt5的部分组件如:QWidget、QLCDNumber、QSlider、QVBoxLayout等的简单使用。

pyqt5_demo.py代码如下:

embed_qt_develop_tutorial_code/PyQt5/pyqt5_demo.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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
import sys
from PyQt5.QtWidgets import QWidget,QLCDNumber,QSlider,QVBoxLayout,QApplication
from PyQt5.QtCore import Qt

class WinForm(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        #1 先创建滑块和 LCD 部件
        lcd = QLCDNumber(self)
        slider = QSlider(Qt.Horizontal, self)

        slider.setMaximum(1000)
        lcd.display(666)
        slider.setValue(666)

        #2 通过QVboxLayout来设置布局
        vBox = QVBoxLayout()
        vBox.addWidget(lcd)
        vBox.addWidget(slider)

        self.setLayout(vBox)
        #3 valueChanged()是Qslider的一个信号函数,只要slider的值发生改变,它就会发射一个信号,然后通过connect连接信号的接收部件,也就是lcd。
        slider.valueChanged.connect(lcd.display)

        slider.setMinimumWidth(200)
        slider.setFixedHeight(60)

        style = "QSlider::groove:horizontal {border:1px solid #999999;height:10px;" \
                "background-color:#666666;margin:2px 0;}" \
                "QSlider::handle:horizontal {background-color:#ff0000;border:1px solid #797979;" \
                "width:50px;margin:-20px;border-radius:25px;}" \

        slider.setStyleSheet(style);

        #self.setGeometry(0,0,800,480)
        self.setWindowTitle("拖动滑块LCD显示")

if __name__ == '__main__':
    app = QApplication(sys.argv)
    form = WinForm()
    form.resize(800, 480)
    form.show()
    sys.exit(app.exec_())

下面是例程在Window下面的效果:

当我们拖动进度条的时候,会LCD上的数值会相应变化。

pyqt_windows008

6.2. Ubuntu PyQt5 开发环境

按照之前的教程,Qt Creator 版本在4.7,我们不妨将Qt Creator升级到4.14, 其他步骤和Windows相同。

pyqt5_demo.py在Ubuntu上的效果。

pyqt_ubuntu001

6.3. Lubancat PyQt5 开发环境

在LubanCat上,我们直接使用命令安装相关环境

6.3.1. python安装

sudo apt-get -y install python3-pip python3

6.3.2. PyQt5安装

sudo apt-get -y install python3-pyqt5

6.3.3. LubanCat测试PyQt5

接下来我们测试一下PyQt5在开发板上的运行:

创建一个run_pyqt5.sh脚本,通过它来运行我们的pyqt5_demo.py, 为什么需要一个脚本呢,是因为我们需要导出相关的环境变量,比如显示、触摸等环境变量, 这个脚本需要使用sudo权限运行。

run_pyqt5.sh脚本内容如下:

embed_qt_develop_tutorial_code/app_bin/run_pyqt5.sh
 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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#! /bin/bash

if [ ! $1 ]; then
  echo "- usage;"
  echo "- sudo ./run_pyqt5.sh xxx"
  echo "- xxx is your pyqt5.py"
  exit
else
  echo "current pyqt $1"
fi

type devscan

#判断devscan是否存在,不存在提示安装

if [ $? -eq 0 ]; then
    #未检查到触摸屏则一直检测不启动app
    timeout=0
    while [ ! $eventx ]
    do
        #寻找名叫goodix-ts的触摸屏驱动
        eventx=$(devscan "goodix-ts")
        #没有找到则寻找Goodix Capacitive TouchScreen
        if [ ! $eventx ]; then
                eventx=$(devscan "Goodix Capacitive TouchScreen")
        fi
        #没有找到则寻找iMX6UL Touchscreen Controller
        if [ ! $eventx ]; then
                eventx=$(devscan "iMX6UL Touchscreen Controller")
        fi
        ########################################################
        # 添加你自己的显示屏驱动
        # 首先 sudo evtest  查看是否存在显示屏驱动
        # 存在添加类似于上面的判断 改为你自己的显示屏驱动名称
        ########################################################
        if [ $timeout -ge 5 ]; then
            break
        fi
        let timeout=$timeout+1
        sleep 1
    done
    #输出当前触摸屏驱动
    echo "eventx=$eventx"
    if [ "$eventx " != " " ]; then
        #判断触摸屏校准文件是否存在,不存在则校准触摸屏,/etc/pointercal为触摸屏校准文件
        if [ ! -f "/etc/pointercal" ]; then
            #指定触摸屏设备
            export TSLIB_TSDEVICE=/dev/input/$eventx
            type ts_calibrate
            if [ $? -eq 0 ]; then
                ts_calibrate
            fi
        fi
        #同步QT默认的坐标轴和触摸屏的坐标轴
        #export QT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS=/dev/input/$eventx:rotate=90:invertx
        export QT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS=/dev/input/$eventx:rotate=0
    else
        echo "eventx is null"
    fi
else
    echo "please install devscan"
    echo
    echo "sudo apt-get install devscan"
    exit
fi

#导出qtdemo的安装目录
export APP_DIR=/usr/local/qt-app
#指定qt插件路径
export QT_QPA_PLATFORM_PLUGIN_PATH=/usr/lib/plugins
#指定qt库路径
#export LD_LIBRARY_PATH=/lib:/usr/lib
#指定字体库
export QT_QPA_FONTDIR=/usr/lib/fonts
#qt命令路径
#export PATH=$PATH:$QT_DIR/libexec
#指定显示终端
export QT_QPA_PLATFORM=linuxfb:fb=/dev/fb0
#禁用QT自带的输入检测
#export QT_QPA_FB_DISABLE_INPUT=1
#TS配置文件
export TSLIB_CONFFILE=/etc/ts.conf
#TS校准文件
export TSLIB_CALIBFILE=/etc/pointercal
#触摸配置
export QT_QPA_GENERIC_PLUGINS=tslib:/dev/input/$eventx
#指定鼠标设备
export QWS_MOUSE_PROTO=tslib
#启用tslib支持而不是依赖于Linux多点触控协议和事件设备
export QT_QPA_EGLFS_TSLIB=1
export QT_QPA_FB_TSLIB=1

#运行App
echo "start pyqt5 demo..."
python3 $1

赋予脚本可执行权限:

chmod +x run_pyqt5.sh

运行:

# sudo + 启动脚本 + 你pyqt脚本路径
sudo ./run_pyqt5.sh pyqt5_demo.py

pyqt5_demo.py在Lubancat上的效果。

pyqt5_001