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。
添加环境变量
1 2 | D:\Program Files\Python\Python39\Scripts\
D:\Program Files\Python\Python39\
|
验证 python 是否安装成功。
python -V
#或者
pip -V
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
安装完成,我们使用下面的代码来测试。 创建文件 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
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
如下图所示:
使用Qt Create创建Python项目
本章例程在 embed_qt_develop_tutorial_code/PyQt5/PyQt5_Creator
编译运行程序
当然我们也可以在控制台下执行 python main.py, 效果相同。
6.1.4. PyQt5 demo¶
当然我们也可以直接用文本来编辑py程序
首先编写一个名字为pyqt5_demo.py的PyQt5应用程序,它主要是用于测试显示、触摸、信号、槽函数、 以及PyQt5的部分组件如:QWidget、QLCDNumber、QSlider、QVBoxLayout等的简单使用。
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上的数值会相应变化。
6.2. Ubuntu PyQt5 开发环境¶
按照之前的教程,Qt Creator 版本在4.7,我们不妨将Qt Creator升级到4.14, 其他步骤和Windows相同。
pyqt5_demo.py在Ubuntu上的效果。
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脚本内容如下:
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上的效果。