添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
Qt是一个C++应用程序框架。它拥有完备的C++图形库和集成了一系列代码模块, 支持C++,Python,QML,Javascript等多种语言,同时也拥有一套完整的设计、开发工具。 使用Qt开发的软件,相同的代码可以在大多数的平台上编译运行,而不需要修改源代码。 它会自动根据平台的不同,表现平台特有的图形界面风格。

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环境变量
2
D:\Program Files\Python\Python39\Scripts\
D:\Program Files\Python\Python39\

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
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代码如下:

    embed_qt_develop_tutorial_code/PyQt5/pyqt5_demo.py
    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.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
    95
    #! /bin/bash
    if [ ! $1 ]; then
      echo "- usage;"
      echo "- sudo ./run_pyqt5.sh xxx"
      echo "- xxx is your pyqt5.py"
      echo "current pyqt $1"
    type devscan
    #判断devscan是否存在,不存在提示安装
    if [ $? -eq 0 ]; then
        #未检查到触摸屏则一直检测不启动app
        timeout=0
        while [ ! $eventx ]
            #寻找名叫goodix-ts的触摸屏驱动
            eventx=$(devscan "goodix-ts")
            #没有找到则寻找Goodix Capacitive TouchScreen
            if [ ! $eventx ]; then
                    eventx=$(devscan "Goodix Capacitive TouchScreen")
            #没有找到则寻找iMX6UL Touchscreen Controller
            if [ ! $eventx ]; then
                    eventx=$(devscan "iMX6UL Touchscreen Controller")
            ########################################################
            # 添加你自己的显示屏驱动
            # 首先 sudo evtest  查看是否存在显示屏驱动
            # 存在添加类似于上面的判断 改为你自己的显示屏驱动名称
            ########################################################
            if [ $timeout -ge 5 ]; then
                break
            let timeout=$timeout+1
            sleep 1
        #输出当前触摸屏驱动
        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
            #同步QT默认的坐标轴和触摸屏的坐标轴
            #export QT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS=/dev/input/$eventx:rotate=90:invertx
            export QT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS=/dev/input/$eventx:rotate=0
            echo "eventx is null"
        echo "please install devscan"
        echo "sudo apt-get install devscan"
    #导出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上的效果。