QML 只能运行在一个受限环境中,这是由于 QML 语言本身有一些限制。为了解决这一问题,我们可以使用 C++ 编写一些功能,供 QML 运行时调用。
为了能够利用 C++ 扩展 QML,首先我们需要理解 QML 的运行机制。
与 C++ 不同,QML 运行在自己的运行时环境中。这个运行时在 QtQml 模块,由 C++ 实现,包含一个负责执行 QML 的引擎,为每个组件保存可访问属性的上下文,以及实例化的 QML 元素组件。
在 Qt Creator 中,我们创建 Qt Quick Application 项目,打开 Qt Creator 自动帮我们生成的 main.cpp,可以看到类似下面的代码(由于版本问题,这段代码可能会有所不同):
#include #include int main(int argc, char *argv[]){
QGuiApplication app(argc, argv); QQmlApplicationEngine engine; engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); return app.exec();}
在这段代码中,QGuiApplication
封装了有关应用程序实例的相关信息(比如程序名字、命令行参数等)。QQmlApplicationEngine
管理带有层次结构的上下文和组件。QQmlApplicationEngine
需要一个 QML 文件,将其加载作为应用程序的入口点。在这个例子中,这个文件就是 main.qml。Qt Creator 帮我们生成的 QML 文件被作为资源文件,因此需要使用“qrc”前缀访问到。这个 QML 文件内容如下:
import QtQuick 2.3import QtQuick.Window 2.2Window {
visible: true MouseArea {
anchors.fill: parent onClicked: {
Qt.quit(); } } Text {
text: qsTr("Hello World") anchors.centerIn: parent }}
这个 QML 文件根元素是Window
项目,包含了一个MouseArea
和Text
。对于根元素是Item
的 QML 文件,使用QmlApplicationEngine
加载并不会显示任何内容,甚至连窗口都不会显示。这是由于,单独一个Item
不能作为独立的窗口,因而没有渲染的容器。QmlApplicationEngine
可以