StupidBeauty
Read times:3260Posted at:Mon Apr 12 04:15:30 2021 - no title specified

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来部署应用程序

Qt Creator 能够针对多个平台实现QML 应用程序 的部署及打包。对于手机设备 Qt Creator 可以直接将应用程序打包成对应平台的安装包格式,例如APK。

当你的应用程序在目标平台上运行的时候,它就需要能够访问到附带的QML 库的安装位置。如果 你使用 qmake ,那么, QT_INSTALL_QML 这个环境变量就会指向那些库的位置。 Qt安装 会将 QML 库安装到这里: <version>/ <compiler> /qml

QML缓存

QML运行 时环境在载入 QML文件 的过程中会解析文件内容并生成字节码。 大部分情况下,那些文件自从 上次载入以来,都没有发生过变动。 为了加快这个载入过程, QML运行 时环境会 每个QML 文件维护一个对应的缓存文件。 这个缓存文件中包含着两部分内容:编译出来的字节码;以二进制形式表示的QML文件结构 。另外 还有一个好处,如果有多个应用程序用到了同一个 QML文件,那么 这段代码所对应的内存也是被那些应用程序进程共享的。 在与POSIX 相兼容的操作系统中,缓存文件是通过 mmap() 这个系统调用来载入的,这会显著地节省内存。

每当 你载入某个已经发生了变动的QML 文件时,对应的缓存会被自动重新创建。缓存文件, 会被存放在 QStandardPaths::CacheLocation 下的"qmlcache"子目录中。对于QML 文件 的缓存文件名后缀是 .qmlc ,对于引入的JavaScript 模块的缓存文件名后缀是 .jsc

预先编译

使用缓存文件来对编译过的QML 文件进行自动化缓存,能够显著地缩短应用程序的载入时间。然而,缓存文件的初始创建过程仍然会消耗很多时间,如果应用程序本身是第一次启动的话其耗用的时间就更长了。为了避免这个初始化过程,以使得初次启动过程更快,Qt的编译系统允许你在编译应用程序中的C++部分时对 QML 文件进行预编译。

要想将你的应用程序中的QML文件进行预编译的话,你必须按照特定的方式来对那些文件进行组织,还需要对编译系统进行设置:

预编译的另一个好处是,如果QML 文件中有语法错误,那么,在编译过程中就能够发现,而不用等到运行时文件真正被载入时才会发现。

利用QML Scene进行原型设计

Declarative UI 软件包中包含了一个 QML运行 时工具,名为 qmlscene ,它能够载入并显示 QML文件 这在程序的开发阶段很有用, 在不用写C++程序来调用QML 运行时环境的情况下,就可以对基于QML 的应用程序进行原型开发。

在应用程序中初始化QML 运行时环境

要想运行以QML 开发的应用程序,就必须调用QML 运行时环境。 你需要写一个Qt C++应用程序,它按照以下的 任一 种方式来载入 QQmlEngine

利用QQuickView来初始化

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

直接创建一个QQmlEngine

如果 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 资源系统来管理资源文件

通过 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 opinions
Posted at:Tue Jun 1 09:04:01 2021晓风向包子童鞋问好~
Your name:Email:Website url:Opinion content:
- no title specified

HxLauncher: Launch Android applications by voice commands