简述
QML 文档由 QML 运行环境加载和执行。这包括 Declarative UI 引擎以及内置的 QML 类型和插件模块,并且它还提供了对第三方 QML 类型和模块的访问。
使用 QML 的应用程序,需要调用 QML 运行环境才能执行 QML 文档。这可以通过创建 QQuickView 或 QQmlEngine 来完成。此外,Declarative UI 包包含了 qmlscene 工具,用于加载 .qml 文件。此工具对于开发和测试 QML 代码非常有用,无需编写 C++ 应用程序即可加载 QML 运行环境。
版权所有:一去丶二三里,转载请注明出处:http://blog.csdn.net/liang19890820
使用 QML Scene 搭建原型
Declarative UI 包包含了一个 QML 运行时工具 - qmlscene,用于加载和显示 QML 文档。这在应用程序开发阶段非常有用,可以针对基于 QML 的应用程序进行原型设计,而无需编写 C++ 代码。
例如,有一个 QML 文件 main.qml:
import QtQuick 2.0
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 模块。