QML 文档由 QML 运行环境加载和执行。这包括 Declarative UI 引擎以及内置的 QML 类型和插件模块,并且它还提供了对第三方 QML 类型和模块的访问。
使用 QML 的应用程序,需要调用 QML 运行环境才能执行 QML 文档。这可以通过创建 QQuickView 或 QQmlEngine 来完成。此外,Declarative UI 包包含了 qmlscene 工具,用于加载 .qml 文件。此工具对于开发和测试 QML 代码非常有用,无需编写 C++ 应用程序即可加载 QML 运行环境。
简述使用 QML Scene 搭建原型 在应用程序中初始化 QML 运行环境 用 QQuickView 初始化直接创建 QQmlEngine版权所有:一去丶二三里,转载请注明出处:http://blog.csdn.net/liang19890820
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 运行环境必须由应用程序调用。这可以通过编写一个 Qt C++ 应用程序来完成,该程序可以通过以下两种方式来加载 QQmlEngine:
通过 QQuickView 加载 QML 文件创建一个 QQmlEngine,并使用 QQmlComponent 加载 QML 文件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如果 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 模块。
相关资源:QPainter 与QML SceneGraph绘制效率对比测试