7. GUI库 - PyQt5

  • 平台:鲁班猫

  • 系统:Debian

  • Python版本:Python3.7

  • PyQt版本:PyQt5

7.1. PyQt5库简介

PyQt是Qt应用框架与Python的结合,同时支持Python2.x和Python3.x版本,本教程使用的是Python3.7版本,PyQt5版本。

PyQt5是由一系列Python模块组成,超过620个类,6000函数和方法。能在诸如Unix、Windows和Mac OS等主流操作系统上运行,而且由于Python语言的开发方便性,在编写代码时比C++更为方便,美中不足的是Python语言的执行效率会比C++慢。

7.2. PyQt5库安装

7.2.1. Qt库安装

我们使用apt工具安装。

安装PyQt5:

sudo apt-get -y install python3-pyqt5

7.2.2. 依赖库安装

最后安装一些依赖的deb包,它主要是用于提供tslib触摸、中文字库等功能:

sudo apt-get -y install libts-bin devscan ebf-tslibplugin ebf-fonts

然后运行:

sudo depmod -a

最后重启开发板,这样子环境就搭建完成。

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

重要

实验前请确保LCD驱动及触摸屏驱动的设备树插件已经开启,前面章节有述。

7.3. PyQt5库使用

首先编写一个名字为pyqt5_demo.py的PyQt5应用程序,它主要是用于测试显示、触摸、信号、槽函数、以及PyQt5的部分组件如:QWidget、QLCDNumber、QSlider、QVBoxLayout等的简单使用,虽然是很简单的程序,但足以满足我们的测试,这样子就能说明野火开发板的Debian系统是可以运行PyQt5的,并且可以通过它看出PyQt5的执行效率,目前我的测试还是可以非常快响应的。

pyqt5_demo.py代码如下:

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_())

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

run.sh脚本内容如下:

#! /bin/bash

if [ ! $1 ]; then
  echo "- usage;"
  echo "- sudo ./run_pyqt5.sh xxx"
  echo "- xxx is your pyqt5_demo.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.sh

运行:

sudo ./run.sh pyqt5_demo.py

效果:

pyqt5_001

大家可以将配套代码目录 libdemo\PyQt5\pyqt5_demo.py及run.sh文件,上传到开发板中测试。