How to Build, Install and Setting Qt Application/zh

From FriendlyELEC WiKi
Jump to: navigation, search

English

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

[1]

  • RK3399 Lubuntu, S5P4418/S5P6818/H3/H5 FriendlyCore

[2]

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

扫雷程序的界面如下图所示:
Friendlydesktop-minesweeper-qt5.png

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
export QT_QPA_EGLFS_ROTATION=90
export QT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS=/dev/input/event0:rotate=90
./YourApp

可设置角度值为: 0, 90, 180, or 270

xcb方式运行时:
xrotate.sh -m CW
mv xorg.conf.new /etc/X11/xorg.conf
. setqt5env-xcb
startx ./YourApp -geometry 1280x800

备注: 上面的1280x800请更改为实际的屏幕分辨率,xrotate.sh的帮助信息请用xrotate.sh -h命令查看。

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 项的选中。