| ||
By Toradex秦海
1). 简介
Python binding 的 Qt GUI 库一直以来有两种,最初是由 Riverbank Computing 公司在 2000 年初发布,基于 Qt4 版本推出的 PyQt4,后来随着 Qt 库版本的演进也陆续跟进到 PyQt5 和最新的 PyQt6,由于发布的比较早其代码成熟以及文档完善的也比较早,之前我们也写过 PyQt5 测试的相关文章,但是 PyQt 的 License 相对比较严格,是 GPLv3 和 Commercial 两种,所以如果是商业产品开发使用,不购买 Commercial License 就要开源整个应用。
基于这种情况,Qt官方早至 Nokia 时期的 2009 年就发布了对应 Pyqt 的 Python binding 项目 PySide,采用 LGPL License ;然后到了 Qt Digia 时期的 2015年,才发布了 PySide 1.2.x 版本,对应 Qt4.8.x 版本;但是由于推出的时间比较晚等原因,Pyside 1.x 的流行度并不太好。接下来 Qt 基于新发布的 Qt5 版本,启动 Qt for Python 项目,最终基于 Qt 5.12.x 发布了 PySide2,由于支持 LGPL License以及 Qt 官方的支持,PySide2 逐渐成熟文档也日趋完善,接受度也越来越高。然后针对最新的 Qt6 版本,Qt for Python 项目也继续从 Qt 6.6 版本开始发布了最新的 PySide6 版本,本文就基于 NXP i.MX8M plus处理器平台简单测试 PySide6 的部署运行。
本文所演示的平台来自于 Toradex Verdin i.MX8MP 嵌入式平台。
2. 准备
a). Verdin i.MX8MP ARM核心版配合Dahlia 载板,并连接调试串口和 HDMI 显示器用于测试。
3). Verdin i.MX8MP Yocto Linux 编译部署
a). 首先参考这里说明创建 Yocto/Openembedded 编译框架,当前最新版本是对应于 Toradex Yocto Linux BSP 6.x 版本的 kirkstone-6.x.y branch。
b). 由于默认配置只包含了 meta-qt5 layer,因此需要参考如下操作将 meta-qt5 替换为 包含 PySide6 支持在内的 meta-qt6 layer,本文测试基于 Qt 6.6.x 版本,可以跟进实际需求改为不低于 Qt 6.6 的版本。
-------------------------------
### 移除 meta-qt5 layer ###
$ cd <OE_ROOT_PATH>/layers
$ rm -rf meta-qt5
### add meta-qt6 layer ###
$ git clone -b 6.6.3 git://code.qt.io/yocto/meta-qt6.git
### add meta-clang layer for PySide6 ###
$ git clone -b kirkstone https://github.com/kraj/meta-clang.git
-------------------------------
c). 参考这里文章说明增加 packagegroup-tdx-qt6.bb 和 tdx-reference-multimedia-qt6-image.bb 文件
d). 修改 bblayers.conf 和 local.conf 文件
-------------------------------
### modify bblayer.conf ###
--- a/build/conf/bblayers.conf 2023-03-30 11:13:22.946533642 +0800
+++ b/build/conf/bblayers.conf 2023-03-28 16:01:12.614534560 +0800
@@ -34,7 +34,7 @@
${TOPDIR}/../layers/meta-openembedded/meta-python \
${TOPDIR}/../layers/meta-freescale-distro \
${TOPDIR}/../layers/meta-toradex-demos \
- ${TOPDIR}/../layers/meta-qt5 \
+ ${TOPDIR}/../layers/meta-qt6 \
+ ${TOPDIR}/../layers/meta-clang \
\
\
${TOPDIR}/../layers/meta-toradex-distro \
### add below to local.conf ###
# remove x11 related
DISTRO_FEATURES:remove = " directfb x11"
# add python3/python3-pyside6 and Chinese fonts support
IMAGE_INSTALL:append = " python3 python3-pip python3-pyside6 python3-numpy ttf-droid-sans ttf-droid-sans-fallback ttf-droid-sans-mono ttf-droid-serif freetype"
# enable gstreamer for qtmultimedia if needed
PACKAGECONFIG:append:pn-qtmultimedia = " gstreamer"
# add Freescale EULA
ACCEPT_FSL_EULA = "1"
-------------------------------
e). 编译 Yocto Linux image
-------------------------------
### compile Reference-Multimedia image ###
$ MACHINE="verdin-imx8mp" bitbake tdx-reference-multimedia-qt6-image
### compile SDK ###
$ MACHINE="verdin-imx8mp" bitbake tdx-reference-multimedia-qt6-image -c populate_sdk
-------------------------------
f). Yocto Linux image部署
参考这里通过Toradex Easy installer将上面编译好的image更新部署到模块
4). PySide6 Example应用获取和测试
a). Qt 官方网站这里提供了丰富的 PySide6 Examples 示例应用,更多开发指导文档可以参考如下:
https://doc.qt.io/qtforpython-6.6/index.html
b). 分别使用一个 Qt Multimedia 应用和一个 Qt Charts 应用进行测试
./ Qt Multimedia 应用 – 详细说明请参考这里,可以从页面直接下载应用 mediaplayer 文件夹并上传到 Verdin i.MX8MP Yocto Linux /home/root 目录
./ Qt Charts 应用 – 详细说明请参考这里,可以从页面直接下载应用 chartthemes 文件夹并上传到 Verdin i.MX8MP Yocto Linux /home/root 目录
c). 创建开机自启动systemd service文件
-------------------------------
[Unit]
Description=Start a wayland application
After=weston.service
Requires=weston.service
[Service]
Type=simple
User=root
PAMName=login
Environment=WAYLAND_DISPLAY=/run/wayland-0
Environment=QT_QPA_PLATFORM=wayland-egl
### if is mediaplayer app
ExecStart=python3 /home/root/mediaplayer/mediaplayer.py
### if is chartthemes app
ExecStart=python3 /home/root/chartthemes/main.py
Restart=on-failure
RestartSec=1
[Install]
WantedBy=graphical.target
-------------------------------
d). enable service 并测试
-------------------------------
$ systemctl enable wayland-app-launch
$ reboot
-------------------------------
e). 重启后分别启动 mediaplayer 和 chartthemes 应用效果如下
// 注意下如果要使用 mediaplayer 播放视频文件,由于 QtMultimedia 6.6 版本播放媒体需要调用 Gstreamer videoconvertscale 元件,而这个元件是要 Gstreamer 1.22 版本以上才支持,如果当前 Yocto 版本中支持的版本过低需要通过单独升级 Gstreamer 或者整体升级 Yocto 版本来满足。
5). 总结
本文基于 NXP i.MX8MP 处理器简单演示了 PySide6 应用的部署运行。