How to Build, Install and Setting Qt Application/zh
Contents
1 Qt版本介绍
Qt针对不同型号的开发板,提供了不同的Qt版本,Qt支持的特性也不同,请参照下面的表格:
CPU名称 | Qt版本 | 显示驱动 | OpenGL | QtWebEngine | QtMultimedia硬解 | 触摸屏 | 显示屏 | 对应开发板 |
RK3328/RK3399/RK3568/RK3588 | Qt 5.10.0 | eglfs_kms, eglfs, xcb, webgl, vnc | Yes | Yes | Yes | 多点触摸 | 双屏异显 | NanoPC-T4/NanoPC-T6/NanoPi-R6S/NanoPi-R6C/CM3588/NanoPi-R5S/NanoPi-R5C |
S5P4418 | Qt 5.10.0 | eglfs, xcb, vnc | Yes | Yes | No | 多点触摸 | 单屏 | NanoPi S2/NanoPi M2A/NanoPi Fire2/NanoPC T2/Smart4418 |
S5P6818 | Qt 5.10.0 | eglfs, xcb, vnc | Yes | Yes | No | 多点触摸 | 单屏 | NanoPi M3/NanoPi Fire3/NanoPC T3 |
Allwinner H3 | Qt 4.8.6 | LinuxFB | No | No | No | 单点触摸 | 单屏 | NanoPi-Duo/NanoPi-M1-Plus/NanoPi-M1/NanoPi-NEO-Air/NanoPi-NEO-Core/NanoPi-NEO |
Allwinner H5 | Qt 4.8.6 | LinuxFB | No | No | No | 单点触摸 | 单屏 | NanoPi-K1-Plus/NanoPi-NEO-Core2/NanoPi-NEO-Plus2/NanoPi-NEO2 |
Amlogic S905 | Qt 5.9.1 | LinuxFB | No | No | No | 多点触摸 | 单屏 | NanoPi-K2 |
2 安装Qt交叉编译环境
(注意:RK3328/RK3399/RK3568/RK3588 FriendlyCore需要使用的PC操作系统为 Ubuntu 18.04 64位系统,其他平台需要使用Ubuntu 16.04 64位系统)
点击此链接下载压缩包,PC端的操作系统要求如下表所示:
CPU名称与OS | Qt版本 | PC操作系统需求 |
RK3328/RK3399/RK3568/RK3588 FriendlyCore | Qt 5.10.0 | Ubuntu 18.04 64位系统 |
RK3399 Lubuntu | Qt 5.10.0 | Ubuntu 16.04 64位系统 |
S5P4418 FriendlyCore | Qt 5.10.0 | Ubuntu 16.04 64位系统 |
S5P6818 FriendlyCore 32bit | Qt 5.10.0 | Ubuntu 16.04 64位系统 |
S5P6818 FriendlyCore 64bit | Qt 5.10.0 | Ubuntu 16.04 64位系统 |
Allwinner H3 FriendlyCore | Qt 4.8.6 | Ubuntu 16.04 64位系统 |
Allwinner H5 FriendlyCore | Qt 4.8.6 | Ubuntu 16.04 64位系统 |
Amlogic S905 FriendlyCore | Qt 5.9.1 | Ubuntu 16.04 64位系统 |
在电脑上执行以下命令安装:
tar xzf qtsdk-friendlyelec-20210403.tgz cd CPUName chmod 755 ./install.sh sudo ./install.sh
3 本地搭建Qt交叉编译环境
下面以下载并编译一个 QtE-Demo 为例,分别说明在各个平台编译一个 Qt应用程序的步骤:
3.1 RK3328/RK3399/RK3568/RK3588 FriendlyCore平台的编译
git clone https://github.com/friendlyarm/QtE-Demo mkdir build && cd build /usr/local/Trolltech/Qt-5.10.0-rk64one-sdk/bin/qmake ../QtE-Demo/QtE-Demo.pro make
3.2 RK3399 Lubuntu平台的编译
cd /work/ git clone https://github.com/friendlyarm/QtE-Demo mkdir build && cd build /usr/local/Trolltech/Qt-5.10.0-rk32xcb-sdk/bin/qmake ../QtE-Demo/QtE-Demo.pro make
3.3 S5P4418平台的编译
git clone https://github.com/friendlyarm/QtE-Demo mkdir build && cd build /usr/local/Trolltech/Qt-5.10.0-nexell32-sdk/bin/qmake ../QtE-Demo/QtE-Demo.pro make
3.4 S5P6818平台的编译
git clone https://github.com/friendlyarm/QtE-Demo mkdir build && cd build //usr/local/Trolltech/Qt-5.10.0-nexell64-sdk/bin/qmake ../QtE-Demo/QtE-Demo.pro make
3.5 Allwinner H3平台的编译
export PATH=/opt/FriendlyARM/toolchain/4.9.3/bin/:$PATH git clone https://github.com/friendlyarm/QtE-Demo mkdir build && cd build /usr/local/Trolltech/QtEmbedded-4.8.6-arm/bin/qmake ../QtE-Demo/QtE-Demo-Qt4.pro make
3.6 Allwinner H5平台的编译
cd export PATH=/opt/FriendlyARM/toolchain/4.9.3/bin/:$PATH git clone https://github.com/friendlyarm/QtE-Demo mkdir build && cd build /usr/local/Trolltech/QtEmbedded-4.8.6-arm/bin/qmake ../QtE-Demo/QtE-Demo-Qt4.pro make
3.7 Amlogic S905平台的编译
export PATH=/opt/FriendlyARM/toolchain/6.4-aarch64/bin/:$PATH git clone https://github.com/friendlyarm/QtE-Demo mkdir build && cd build /usr/local/Trolltech/QtEmbedded-5.9.1-arch64/bin/qmake ../QtE-Demo/QtE-Demo.pro make
4 使用Docker来构建交叉编译环境
Cross-compiling Qt application in Docker:
- RK3328/RK3399/RK3568/RK3588 FriendlyCore
- RK3399 Lubuntu, S5P4418/S5P6818/H3/H5 FriendlyCore
5 在开发板上运行Qt程序
运行Qt程序之前,需要先设置环境变量。
Qt5,RK3399/RK3568/RK3588平台提供了4个脚本文件用于设置Qt环境变量,分别为:
脚本文件名 作用 /usr/bin/setqt5env-kms 设置kms插件所需要的环境变量 /usr/bin/setqt5env-eglfs 设置eglfs插件所需要的环境变量 /usr/bin/setqt5env-xcb 设置xcb插件所需要的环境变量 /usr/bin/setqt5env-nogui 仅供无界面的Qt程序使用
S5P4418与S5P6818平台则提供了3个脚本用于设置Qt环境变量,分别为:
脚本文件名 作用 /usr/bin/setqt5env-eglfs 设置eglfs插件所需要的环境变量 /usr/bin/setqt5env-xcb 设置xcb插件所需要的环境变量 /usr/bin/setqt5env-nogui 仅供无界面的Qt程序使用
例如要设置用KMS插件来显示程序界面,可以使用以下命令:
. /usr/bin/setqt5env-kms
(注: .与字母s之间有个空格)
Qt4,使用 setqt4env:
. /usr/bin/setqt4env
例如运行上一章节编译的QtE-Demo:
./QtE-Demo -qws
6 在开发板上编译Qt应用程序
6.1 编译qmake项目 (以QtE-Demo为例)
下面以下载并编译一个 QtE-Demo 为例,此方式目前仅支持RK3399、S5P4418和S5P6818平台:
git clone https://github.com/friendlyarm/QtE-Demo mkdir build && cd build qmake-qt5 ../QtE-Demo/QtE-Demo.pro make . setqt5env ./QtE-Demo
6.2 编译cmake项目 (以github上的扫雷游戏为例)
此方式目前仅支持RK3399、S5P4418和S5P6818平台:
. setqt5env git clone https://github.com/phoemur/minesweeper cd minesweeper mkdir -p build cd build cmake -DCMAKE_PREFIX_PATH=$QTDIR .. make -j4 export DISPLAY=:0.0 ./minesweeper
7 开机自动运行Qt程序
以运行上一章节中的 QtE-Demo 程序为例,假设它放在 /root 目录,则你可以编辑 /etc/rc.local 文件,确否有以下内容:
. /usr/bin/setqt5env /root/QtE-Demo -qws&
如果是 Qt4,请将setqt5env改为setqt4env。
8 安装Qt5.10官方示例
Qt5.10示例压缩包可以在网盘以下路径获得:
sources/qt5.10-XXXXXX-examples
压缩包解压到根目录即可(下面的命令以RK3399 FriendlyDesktop系统为例):
sudo tar xvzf Qt-5.10.0-rk64one-examples.tgz -C /<br />
用以下命令运行示例,比如运行opengl的示例(下面的命令以RK3399 FriendlyDesktop系统为例):
export DISPLAY=:0.0 /usr/local/Trolltech/Qt-5.10.0-rk64one/examples/opengl/hellowindow/hellowindow
9 屏幕旋转
9.1 Qt屏幕旋转
CPU名称与OS | Qt版本 | 屏幕旋转方法 |
RK3328/RK3399/RK3568/RK3588 FriendlyCore | Qt 5.10.0 | kms方式运行时: . setqt5env-kms |
S5P4418 FriendlyCore | Qt 5.10.0 | export ROTATION=-90 . setqt5env ./YourApp 可设置角度值为: 0, 90, 180, -90 |
S5P6818 FriendlyCore | Qt 5.10.0 | export ROTATION=-90 . setqt5env ./YourApp 可设置角度值为: 0, 90, 180, -90 |
Allwinner H3 FriendlyCore | Qt 4.8.6 | . setqt4env export QWS_DISPLAY='Transformed:Rot90' ./YourApp 可设置角度值为: 0, 90, 180, 270 |
Allwinner H5 FriendlyCore | Qt 4.8.6 | . setqt4env export QWS_DISPLAY='Transformed:Rot90' ./YourApp 可设置角度值为: 0, 90, 180, 270 |
Amlogic S905 FriendlyCore | Qt 5.9.1 | . setqt5env export QT_QPA_PLATFORM=linuxfb:fb=/dev/fb0:rotation=90 ./YourApp 可设置角度值为: 0, 90, 180, 270 |
9.2 X11屏幕旋转 (仅适用于RK3399)
当你的Qt程序运行在X11系统时,例如在RK3399平台,使用 xcb 的插件运行 Qt 程序,或者在 Lubuntu 下运行 Qt 程序,可以使用X11的屏幕旋转功能。
目前暂时只支持 eDP屏 的显示旋转:
如果要旋转eDP屏的显示,可使用命令xrotate.sh 来旋转90/180/270度。
以root用户运行以下命令即可顺时钟旋转90度,会重启lightdm服务让设置立即生效:
sudo xrotate.sh -m CW -r
运行 xrotate -h 可获得该命令详细的参数说明。
另外,该命令暂不支持HDMI显示的旋转,用户可自己编辑/etc/X11/xorg.conf。
10 常见问题
10.1 编译程序出现错误 ../QtE-Demo/main.cpp:18:21: fatal error: QtWidgets: No such file or directory
解决办法:检查一下qmake所生成的Makefile,正常情况Qt5的包含路径指向的是 sysroot 的地址即 rootfs-s5p4418或rootfs-s5p6818,你需要/opt目录下是否存在这个目录,不存在的话就重新安装一下sdk。
10.2 FriendlyDesktop下单独运行Qt程序无法取消全屏?
在程序后面加上--platform xcb参数即可,如下所示:
./HelloQt --platform xcb
如下代码演示如果居中显示窗口:
#include "widget.h" #include <QApplication> #include <QDesktopWidget> int main(int argc, char *argv[]) { QApplication a(argc, argv); Widget w; w.adjustSize(); w.move(QApplication::desktop()->screen()->rect().center() - w.rect().center()); w.show(); return a.exec(); }
10.3 如何隐藏控制台光标?
关闭光标
sudo echo 0 > /sys/class/graphics/fbcon/cursor_blink
恢复光标
sudo echo 1 > /sys/class/graphics/fbcon/cursor_blink
10.4 如何隐藏和显示鼠标光标?
使用Qt5 EGLFS运行程序时,通过QT_QPA_EGLFS_HIDECURSOR环境变量来控制鼠标光标的显示与隐藏, 设置为1时会隐藏光标,设置为0时会显示光标。
例如,在执行 setqt5env 脚本之后执行:
export QT_QPA_EGLFS_HIDECURSOR=0
即可显示光标,如果光标仍然无法显示,可尝试关闭硬件光标,方法是创建一个配置文件例如 kms-config.json,内容如下:
{ "device": "/dev/dri/card0", "hwcursor": false }
然后使用环境变量指定该配置文件:
export QT_QPA_EGLFS_KMS_CONFIG=$PWD/kms-config.json
示例:
#!/bin/bash . /usr/bin/setqt5env-kms export QT_QPA_EGLFS_HIDECURSOR=0 cd /opt/Qt5_CinematicExperience export QT_QPA_EGLFS_KMS_CONFIG=$PWD/kms-config.json [ $(id -u) -eq 0 ] && echo 0 > /sys/class/graphics/fbcon/cursor_blink ./Qt5_CinematicExperience -qws [ $(id -u) -eq 0 ] && echo 1 > /sys/class/graphics/fbcon/cursor_blink
10.5 如何延长开机logo的显示时间?(解决启动黑屏问题)
由于内核在启动时会将屏幕初始化为终端,从而导致开机logo图片在短暂显示后就被冲掉变成黑屏,这在量产时是不愿意看到的,
可通过重新配置并编译内核来解决这个问题。
10.5.1 For 4.x 内核
参考如下配置,重新配置并编译内核:
Device Drivers ---> Graphics support ---> Console display dirver support ---> < > Framebuffer Console support
禁用Framebuffer Console support 即可保持Logo的显示,直至Qt应用的运行。
10.5.2 For 3.x 内核
参考如下配置,重新配置并编译内核:
Device Drivers ---> Graphics support ---> [*] Bootup logo ---> [ ] Standard black and white Linux logo [ ] Standard 16-color Linux logo [ ] Standard 224-color Linux logo [*] Copy logo from previous FB Console display driver support ---> [ ] Framebuffer Console support
进入 Device Drivers的Graphics support菜单,勾选Bootup logo,并且只选中 Bootup logo里面的 Copy logo from previous FB。
再回到Graphics support菜单,进入Console display driver support 菜单,取消 Framebuffer Console support 项的选中。