1. Qt Quick和QML

除了Qt Widgets用户界面,Qt为了更好的支持移动端开发还支持Qt Quick用户界面设计。

Qt Quick 模块是用于编写QML应用程序的标准库。 Qt QML模块提供了QML引擎和语言基础结构,而Qt Quick模块提供了使用QML创建用户界面所需的所有基本类型。 Qt Quick提供了一个可视化画布,并包括用于创建和动画可视化组件、接收用户输入、创建数据模型和视图以及延迟对象实例化的类型。

Qt QML 模块为QML语言开发应用程序和库提供了一个框架,它定义并实现了语言和引擎基础设施,并提供了接口, 使应用程序开发人员能够使用自定义类型扩展QML语言,并将QML代码与 JavaScript和C++集成。Qt QML模块同时提供了QML API 和 C++ API两套接口。

QML 是一种用户界面规范和编程语言。 它使开发人员和设计师都可以创建高性能,流畅动画和视觉吸引力的应用程序。 QML提供了一种高度可读的,声明性的,类似于JSON的语法,并支持将命令性JavaScript表达式与动态属性绑定结合在一起。

简而言之,Qt Quick模块提供了QML语言创建用户界面的所需的所有基础类型,Qt QML模块提供了QML的引擎和语言基础。

本章将简单构建一个Quick工程,并在LubanCat板卡上运行。

1.1. Hello Qt Quick

不同于Qt Widgets使用C++ API开发,Qt Quick使用一种声明式的QML语言来构建用户界面,使用JavaScript来实现逻辑。

提示

测试的鲁班猫板卡系统是Debian10(带桌面),使用野火5.5寸mipi屏。

1.1.1. 创建工程文件

1、打开Qt Creator,点击 文件 -> New Project... (或者使用快捷键Ctrl+Shift+N), 然后选择新建Quick工程文件:

quick001

2、然后设置工程的名称和路径:

quick001

3、选择使用的构建工具,选择要求的Qt版本(Qt5以上):

quick001

4、然后选择编译套件 Lubancat_rk_debian10, 关于编译套件的配置,参考下前面 Qt编译章节

quick001

5、点击完成,最后工程生成的文件:

quick002
  • HelloQuick.pro 为Qt特有的项目文件,用来管理Qt项目(使用qmake作为构建系统时会创建)

  • main.cpp main函数所在的文件

  • main.qml qml文件

  • qml.qrc 资源管理文件

生成的工程文件:

quick003

1.1.2. 修改工程并运行

1、修改HelloQuick.pro文件,设置下远程安装路径:

HelloQuick.pro
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
QT += quick

# You can make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

SOURCES += \
      main.cpp

RESOURCES += qml.qrc

# Additional import path used to resolve QML modules in Qt Creator's code model
QML_IMPORT_PATH =

# Additional import path used to resolve QML modules just for Qt Quick Designer
QML_DESIGNER_IMPORT_PATH =

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
#else: unix:!android: target.path = /opt/$${TARGET}/bin
else: unix:!android: target.path = /home/cat/qt/quick
!isEmpty(target.path): INSTALLS += target

2、打开main.qml文件,在窗口中添加一个Text控件:

main.qml
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
import QtQuick 2.15
import QtQuick.Window 2.15

Window {
   width: 640
   height: 480
   visible: true
   title: qsTr("Hello World")

   Text {
      anchors.centerIn: parent
      text: "Hello, Quick!"
      font.pixelSize: 16
   }
}

或者点击main.qml文件,然后点击旁边的设计,进入qml设计器:

quick004

如果点击main.qml,旁边的 设计 图标没有高亮(无法进入设计器,可能是没有安装插件), 可以点击 帮助 -> 关于插件... ,然后勾选QmlDesigner插件:

quick005

我们向Ui窗口拖一个Text控件,修改属性使其文字居中等等。

3、最后编译程序就能看到前面一样的效果(注意编译使用 Lubancat_rk_debian10 套件):

# 简单测试,指定库路径,使用eglfs插件显示
cat@lubancat:~/qt/quick$ LD_LIBRARY_PATH=/opt/qt-everywhere-src-5.15.8/ext/lib ./HelloQuick -platform eglfs
QML debugging is enabled. Only use this in a safe environment.
arm_release_ver of this libmali is 'g2p0-01eac0', rk_so_ver is '4'.
Unable to query physical screen size, defaulting to 100 dpi.
To override, set QT_QPA_EGLFS_PHYSICAL_WIDTH and QT_QPA_EGLFS_PHYSICAL_HEIGHT (in millimeters).
quick005

4、下面我们就来看一看工程中文件的源码:

先看工程文件HelloQuick.pro(看代码中注释),使用SOURCES和RESOURCES环境变量为工程分别添加源文件和资源文件,main.qml就是作为资源文件添加。

HelloQuick.pro
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 添加quick模块
QT += quick

# You can make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

# 源文件
SOURCES += \
      main.cpp

# 资源文件
RESOURCES += qml.qrc

# Additional import path used to resolve QML modules in Qt Creator's code model
QML_IMPORT_PATH =

# Additional import path used to resolve QML modules just for Qt Quick Designer
QML_DESIGNER_IMPORT_PATH =

# 指定安装路径
# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
#else: unix:!android: target.path = /opt/$${TARGET}/bin
else: unix:!android: target.path = /home/cat/qt/quick
!isEmpty(target.path): INSTALLS += target

接下来看下主文件main.cpp,该文件主要是加载资源文件中的main.qml,

main.cpp
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <QGuiApplication>
#include <QQmlApplicationEngine>

int main(int argc, char *argv[])
{
// 检测Qt版本小于6.0.0时,启用高DPI
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
   QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
#endif
   QGuiApplication app(argc, argv);

   // 创建QQmlApplicationEngine对象
   QQmlApplicationEngine engine;
   // 加载QML文件
   const QUrl url(QStringLiteral("qrc:/main.qml"));
   // 设置信号与槽的连接,如果QML对象创建失败且URL与指定的"main.qml"匹配时退出应用程序
   QObject::connect(&engine, &QQmlApplicationEngine::objectCreated,
                     &app, [url](QObject *obj, const QUrl &objUrl) {
      if (!obj && url == objUrl)
            QCoreApplication::exit(-1);
   }, Qt::QueuedConnection);
   engine.load(url);

   // 运行应用程序的事件循环
   return app.exec();
}

1.2. 测试qmlchart官方例程

Qt Charts 是Qt中的一个模块,可以创建炫酷的,可交互式的图表。 Qt Charts使用Graphics View Framework来简化集成。图表组件可用作QWidget或QGraphicsWidget对象或QML类型。

下面我们qt官方给出的一个qchart demo来演示qml程序如何在LubanCat板卡上运行。

启动Qt Creator,搜索qmlchart官方例程。

qml_chart001.png

如果搜索不到,可能是没有安装Qt Charts模块, 需要打开Qt Creator的Qt MaintenanceTool工具安装下Qt Charts模块(也可以直接使用配套例程):

qml_chart001.png

选择编译套件,编译、运行桌面版qmlchart程序

qml_chart002.png
qml_chart003.png

修改安装路径,使用编译套件 Lubancat_rk_debian10,为鲁班猫编译:

qml_chart004.png

点击部署运行,会传输文件到板卡,并运行。运行可能显示找不到库,简单测试可以在鲁班猫上使用命令运行:

# 切换到板卡安装目录
cd ~/qt/qmlchart
# 运行程序,使用eglfs插件
LD_LIBRARY_PATH=/opt/qt-everywhere-src-5.15.8/ext/lib ./qmlchart -platform eglfs

运行显示,可以触摸或者鼠标滑动屏幕,查看表格图形:

qml_chart005.jpg
qml_chart005.jpg

提示

使用系统默认的触摸和鼠标设备,需要root权限。

关于板卡上运行交叉编译的库,我们提供的交叉编译库默认支持qtcharts、qtquick2等模块,配置好板卡环境,就可以直接运行。 交叉编译环境的搭建参考下前面 虚拟机上交叉编译Qt 章节, 远程部署参考下前面 远程连接 章节。