StupidBeauty
Read times:511Posted 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文件。具体地,你可以通过创建QQuickViewQQmlEngine来调用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.qmlbackground.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