Qt 5.15文档翻译:部署QML应用程序,Deploying QML Applications
QML文件,需由QML运行时环境来载入及执行。这里所指的环境,包括:Declarative UI引擎、内置的QML类型、插件模块。同时,QML运行时环境还允许应用程序使用第三方的QML类型及模块。
如果应用程序 中使用了 QML ,那么,就必须调用 QML运行 时环境来执行 QML文件 。具体 地,你可以通过创建 QQuickView 或 QQmlEngine 来调用QML运行时环境,后文会详细说明。另外 , Declarative UI软件 包中也包含了一个 qmlscene工具 ,它也能够载入 .qml文件 。 这个工具 很有用处,使用它,就可以在无需编写 C++ 程序来载入 QML 运行时环境的情况下,开发及测试 QML 代码。
Qt Creator 能够针对多个平台实现QML 应用程序 的部署及打包。对于手机设备 , Qt Creator 可以直接将应用程序打包成对应平台的安装包格式,例如APK。
当你的应用程序在目标平台上运行的时候,它就需要能够访问到附带的QML 库的安装位置。如果 你使用 qmake ,那么, QT_INSTALL_QML 这个环境变量就会指向那些库的位置。 Qt安装 器 会将 QML 库安装到这里: <version>/ <compiler> /qml 。
QML运行 时环境在载入 QML文件 的过程中会解析文件内容并生成字节码。 大部分情况下,那些文件自从 上次载入以来,都没有发生过变动。 为了加快这个载入过程, QML运行 时环境会 为 每个QML 文件维护一个对应的缓存文件。 这个缓存文件中包含着两部分内容:编译出来的字节码;以二进制形式表示的QML文件结构 。另外 还有一个好处,如果有多个应用程序用到了同一个 QML文件,那么 , 这段代码所对应的内存也是被那些应用程序进程共享的。 在与POSIX 相兼容的操作系统中,缓存文件是通过 mmap() 这个系统调用来载入的,这会显著地节省内存。
每当 你载入某个已经发生了变动的QML 文件时,对应的缓存会被自动重新创建。缓存文件, 会被存放在 QStandardPaths::CacheLocation 下的"qmlcache"子目录中。对于QML 文件 的缓存文件名后缀是 .qmlc ,对于引入的JavaScript 模块的缓存文件名后缀是 .jsc 。
使用缓存文件来对编译过的QML 文件进行自动化缓存,能够显著地缩短应用程序的载入时间。然而,缓存文件的初始创建过程仍然会消耗很多时间,如果应用程序本身是第一次启动的话其耗用的时间就更长了。为了避免这个初始化过程,以使得初次启动过程更快,Qt的编译系统允许你在编译应用程序中的C++部分时对 QML 文件进行预编译。
要想将你的应用程序中的QML文件进行预编译的话,你必须按照特定的方式来对那些文件进行组织,还需要对编译系统进行设置:
•. 你的应用程序中,必须使用 qrc:/// 这种资源路径来载入QML 文件。
•. 你可以利用 CONFIG+=qtquickcompiler 指令来启用预编译功能。
预编译的另一个好处是,如果QML 文件中有语法错误,那么,在编译过程中就能够发现,而不用等到运行时文件真正被载入时才会发现。
Declarative UI 软件包中包含了一个 QML运行 时工具,名为 qmlscene ,它能够载入并显示 QML文件 。 这在程序的开发阶段很有用, 在不用写C++程序来调用QML 运行时环境的情况下,就可以对基于QML 的应用程序进行原型开发。
要想运行以QML 开发的应用程序,就必须调用QML 运行时环境。 你需要写一个Qt C++应用程序,它按照以下的 任一 种方式来载入 QQmlEngine :
•. 通过 一个 QQuickView 实例来载入QML 文件。
•. 创建 一个 QQmlEngine 实例,再使用 QQmlComponent 来载入QML 文件。
QQuickView 是基于 QWindow 的,它可以载入 QML文件 。例如, 有以下的QML 文件, application.qml :
import QtQuick 2.3
Rectangle { width: 100; height: 100; color: "red" }
可在某个 Qt应用程序 的 main.cpp 文件 中用以下代码来载入它:
#include <QGuiApplication>
#include <QQuickView>
int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
QQuickView view;
view.setSource(QUrl::fromLocalFile("application.qml"));
view.show();
return app.exec();
}
这将创建一个基于 QWindow 的视图,其中会显示 application.qml 的内容。
在应用程序的 .pro 项目文件 中,还要给 QT 变量加上 declarative 模块。例如 :
TEMPLATE += app
QT += quick
SOURCES += main.cpp
如果 在 application.qml 中不包含任何图形界面组件,或者,你因为某种原因想要避免使用 QQuickView ,那么,也可以直接创建一个 QQmlEngine 。 在这种情况下, application.qml 在载入后会成为一个 QQmlComponent 实例,而不是被放置到某个视图中去:
#include <QGuiApplication>
#include <QQmlEngine>
#include <QQmlContext>
#include <QQmlComponent>
int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
QQmlEngine engine;
QQmlContext *objectContext = new QQmlContext(engine.rootContext());
QQmlComponent component(&engine, "application.qml");
QObject *object = component.create(objectContext);
// ... 在必要的时候,删除object和objectContext
return app.exec();
}
如果 你并未使用 Qt Quick 中的任何图形界面元素,那么,上面的代码中,可将 QGuiApplication 替换成 QCoreApplication 。通过 这种做法,可以纯粹将 QML当成 一门语言来使用,完全不依赖 Qt GUI 模块。
通过 Qt资源系统 ,可将资源文件以二进制文件的形式储存到应用程序的可执行文件中去。 这种功能,在开发 QML/C++混合应用程序 时很有用,因为 ,你可以 对 QML文件 和其它资源文件(例如图片文件和声音文件) 以资源系统文件路径的方式进行引用, 而不需要去考虑文件系统的相对路径和绝对路径。
注意 :如果你使用了资源系统,那么,每当有某个QML 源文件发生变动时,都需要对应用程序可执行程序进行重新编译,以更新软件包中的资源文件内容。
按照以下方式来做,以便在QML/C++混合应用程序中使用资源系统:
•. 创建 一个 .qrc 资源列表文件 ,它以XML 格式列出所有的资源文件。
•. 在 C++代码 中, 以 :/ 前缀的形式或者以 qrc 风格的资源路径形式来载入主要的QML 文件。
实现 以上两点之后,其它所有在QML 中以相对路径指定的文件,都会通过资源系统来载入。资源系统 ,对于 QML层面 是完全透明的; 这就意味着,所有 的 QML代码 中,都应当通过相对路径 来引用资源文件, 而 不 应当通过 qrc 风格的资源路径来进行引用。 这种风格,只应当用于在C++代码中引用资源文件。
以下是一个利用Qt 资源系统开发的应用程序包;它的目录结构如下:
project
|- example.qrc
|- main.qml
|- images
|- background.png
|- main.cpp
|- project.pro
此处 的 main.qml 和 background.png 两个文件 是以资源文件的形式打包起来的。 在 example.qrc 这个资源列表文件中是这样写的:
<!DOCTYPE RCC >
<RCC version= "1.0" >
<qresource prefix= "/" >
<file>main.qml</file>
<file>images/background.png</file>
</qresource>
</RCC>
由于 background.png 是一个资源文件,所以,在 main.qml 中,可以按照它们在 example.qrc 中的相对路径来引用它:
// main.qml
import QtQuick 2.3
Image { source : "images/background.png" }
为了让QML 能够正确地确定资源文件的路径,需要 在 main.cpp 中以 qrc 风格的路径来载入主要的QML 文件,即 main.qml :
int main( int argc, char *argv[])
{
QApplication app(argc, argv);
QQuickView view;
view.setSource(QUrl("qrc:/main.qml"));
view.show();
return app.exec();
}
最后 一步,要在 project.pro 中使用 RESOURCES 变量 ,指定使用 example.qrc 来构建应用程序的资源内容:
QT += qml
SOURCES += main.cpp
RESOURCES += example.qrc
La isla bonita
小昭
女飞行员
终结者
张曼玉
月亮
绿豆
Your opinionsHxLauncher: Launch Android applications by voice commands