QML 运行环境

简述

QML 文档由 QML 运行环境加载和执行。这包括 Declarative UI 引擎以及内置的 QML 类型和插件模块,并且它还提供了对第三方 QML 类型和模块的访问。

使用 QML 的应用程序,需要调用 QML 运行环境才能执行 QML 文档。这可以通过创建 QQuickView 或 QQmlEngine 来完成。此外,Declarative UI 包包含了 qmlscene 工具,用于加载 .qml 文件。此工具对于开发和测试 QML 代码非常有用,无需编写 C++ 应用程序即可加载 QML 运行环境。

| 版权声明:一去、二三里,未经博主允许不得转载。

使用 QML Scene 搭建原型

Declarative UI 包包含了一个 QML 运行时工具 - qmlscene,用于加载和显示 QML 文档。这在应用程序开发阶段非常有用,可以针对基于 QML 的应用程序进行原型设计,而无需编写 C++ 代码。

例如,有一个 QML 文件 main.qml:

import QtQuick 2.3

Rectangle {
    width: 300
    height: 300
    color: "lightgray"

    Text {
        anchors.centerIn: parent
        text: "Hello, QML!"
    }
}

关于 main.qml 的详细介绍,可参考:值得纪念的时刻 - Hello, QML!

运行 qmlscene 工具(位于 bin 目录中),选择我们的 QML 文件。

这里写图片描述

点击“打开”按钮,即可运行。

这里写图片描述

当然,也可以使用命令行运行,以 main.qml 作为参数。键入:

qmlscene main.qml

注意: 如果不是使用绝对路径来执行 qmlscene,则需要在环境变量中加入其所在目录。

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

要运行一个使用 QML 的应用程序,QML 运行环境必须由应用程序调用。这可以通过编写一个 Qt C++ 应用程序来完成,该程序可以通过以下两种方式来加载 QQmlEngine:

  • 通过 QQuickView 加载 QML 文件
  • 创建一个 QQmlEngine,并使用 QQmlComponent 加载 QML 文件

用 QQuickView 初始化

QQuickView 是一个基于 QWindow 的类,能够加载 QML 文件。

例如,将上述的 main.qml 加载到 Qt 应用程序的 main.cpp 文件,像这样:

#include <QGuiApplication>
#include <QQuickView>

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);

    QQuickView view;
    view.setSource(QUrl(QStringLiteral("qrc:/main.qml")));
    view.show();

    return app.exec();
}

这将创建一个基于 QWindow 的视图,来显示 main.qml 的内容。

应用程序的 .pro 项目文件包含了 qmake 生成 Makefile(用于编译和链接应用程序)所需的所有信息:

# 告诉 qmake 这是哪种项目,由于构建的是一个应用程序,因此使用 app 模板
TEMPLATE = app

# 声明了要从 C++ 使用的 Qt 库
QT += qml quick

# 构建项目需要一个 C++11 兼容的编译器
CONFIG += c++11

# 列出了应该编译的所有源文件,类似的变量 HEADERS 可用于头文件。
SOURCES += main.cpp

# 告诉 qmake 有一个资源集合,应该被内置到可执行文件中。
RESOURCES += qml.qrc

直接创建 QQmlEngine

如果 main.qml 中没有任何图形组件,或者存在其他原因希望避免使用 QQuickView,可以直接构造 QQmlEngine。这种情况下,main.qml 将作为一个 QQmlComponent 实例被加载,而不是被放入一个 view 中:

#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, "qrc:/main.qml");
    QObject *object = component.create(objectContext);

    // 在必要时,删除 object 和 objectContext

    return app.exec();
}

如果不使用 Qt Quick 中的任何图形项,那么,上述代码中的 QGuiApplication 可以由 QCoreApplication 来代替。这样以来,就可以将 QML 作为一种语言来使用,而无需依赖 Qt GUI 模块。

©️2020 CSDN 皮肤主题: 技术黑板 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值