QQmlApplicationEngine Class
QQmlApplicationEngine 提供了从单个 QML 文件加载应用程序的便捷方法。更多
头文件: | #include <QQmlApplicationEngine> |
CMake: | find_package(Qt6 REQUIRED COMPONENTS Qml) target_link_libraries(mytarget PRIVATE Qt6::Qml) |
qmake: | QT += qml |
继承: | QQmlEngine |
公共函数
QQmlApplicationEngine(QObject *parent = nullptr) | |
QQmlApplicationEngine(const QString &filePath, QObject *parent = nullptr) | |
QQmlApplicationEngine(const QUrl &url, QObject *parent = nullptr) | |
(since 6.5) | QQmlApplicationEngine(QAnyStringView uri, QAnyStringView typeName, QObject *parent = nullptr) |
virtual | ~QQmlApplicationEngine() override |
QList<QObject *> | rootObjects() const |
公共插槽
void | load(const QString &filePath) |
void | load(const QUrl &url) |
void | loadData(const QByteArray &data, const QUrl &url = QUrl()) |
(since 6.5) void | loadFromModule(QAnyStringView uri, QAnyStringView typeName) |
(since 6.0) void | setExtraFileSelectors(const QStringList &extraFileSelectors) |
void | setInitialProperties(const QVariantMap &initialProperties) |
信号
void | objectCreated(QObject *object, const QUrl &url) |
(since 6.4) void | objectCreationFailed(const QUrl &url) |
详细说明
该类结合了QQmlEngine 和QQmlComponent ,为加载单个 QML 文件提供了便捷的方法。它还将一些中央应用程序功能暴露给 QML,C++/QML 混合应用程序通常会通过 C++ 控制这些功能。
它可以这样使用:
#include <QGuiApplication> #include <QQmlApplicationEngine> int main(int argc, char *argv[]) { QGuiApplication app(argc, argv); QQmlApplicationEngine engine("main.qml"); return app.exec(); }
与QQuickView 不同,QQmlApplicationEngine 不会自动创建根窗口。如果要使用Qt Quick 中的可视化项目,则需要将它们放在Window 中。
如果你没有使用任何需要QGuiApplication 的 QML 模块(如QtQuick
),你也可以在 QQmlApplicationEngine 中使用QCoreApplication 。
默认QQmlEngine 的配置更改列表:
- 连接 Qt XML。quit() 到QCoreApplication::quit()
- 自动从与主 QML 文件相邻的 i18n 目录加载翻译文件。
- 当
QJSEngine::uiLanguage
/Qt.uiLanguage
属性发生变化时,将重新加载翻译文件。 - 如果场景包含QQuickWindow ,则自动设置孵化控制器。
- 自动将
QQmlFileSelector
设置为 url 拦截器,对所有 QML 文件和资产应用文件选择器。
可使用从QQmlEngine 继承的方法进一步调整引擎行为。
注意: 翻译文件必须有qml_前缀才能被识别,如qml_ja_JP.qm。
注: 相对于主 QML 文件放置翻译文件,需要在相关的qt_add_translations调用中添加RESOURCE_PREFIX。这需要包括主文件 QML 模块的资源前缀(默认为/qt/qml)和模块 URI。例如,为名为 "Translated "的模块提供翻译文件:
qt_add_translations(qmli18n RESOURCE_PREFIX /qt/qml/Translated/i18n TS_FILE_BASE qml TS_FILE_DIR i18n )
成员函数文档
QQmlApplicationEngine::QQmlApplicationEngine(QObject *parent = nullptr)
使用给定的parent 创建一个新的 QQmlApplicationEngine。稍后您需要调用load() 来加载 QML 文件。
QQmlApplicationEngine::QQmlApplicationEngine(const QString &filePath, QObject *parent = nullptr)
创建一个新的 QQmlApplicationEngine,并从给定的filePath 加载 QML 文件,该路径必须是本地文件或 qrc 路径。如果给定的是相对路径,它将被解释为相对于应用程序的工作目录。
这是为了方便起见,与使用空构造函数并在之后调用 load 相同。
QQmlApplicationEngine::QQmlApplicationEngine(const QUrl &url, QObject *parent = nullptr)
创建一个新的 QQmlApplicationEngine,并在给定的url 加载 QML 文件。这是为了方便起见,与使用空构造函数并在之后调用加载相同。
[explicit, since 6.5]
QQmlApplicationEngine::QQmlApplicationEngine(QAnyStringView uri, QAnyStringView typeName, QObject *parent = nullptr)
创建一个新的 QQmlApplicationEngine 并加载由uri 和typeName 指定的 QML 类型 这是为了方便起见,与使用空构造函数并在之后调用loadFromModule 相同。
该函数在 Qt 6.5 中引入。
[override virtual noexcept]
QQmlApplicationEngine::~QQmlApplicationEngine()
销毁QQmlApplicationEngine 及其加载的所有 QML 对象。
[slot]
void QQmlApplicationEngine::load(const QString &filePath)
加载位于filePath 的 QML 根文件。filePath 必须是本地文件的路径或资源文件系统中文件的路径。如果filePath 是相对路径,它将被视为相对于应用程序的工作目录。文件定义的对象树将立即实例化。
如果出现错误,将通过qWarning 打印错误信息。
[slot]
void QQmlApplicationEngine::load(const QUrl &url)
加载位于url 的 QML 根文件。该文件定义的对象树会立即为本地文件 url 创建。远程 ur 是异步加载的,需要监听objectCreated 信号,以确定对象树何时就绪。
如果发生错误,objectCreated 信号将以空指针作为参数发出,错误信息将以qWarning 打印。
[slot]
void QQmlApplicationEngine::loadData(const QByteArray &data, const QUrl &url = QUrl())
加载data 中给出的 QML。data 中定义的对象树会立即实例化。
如果指定了url ,它将被用作组件的基础 url。这将影响数据和错误信息中的相对路径。
如果出现错误,将通过qWarning 打印错误信息。
[slot, since 6.5]
void QQmlApplicationEngine::loadFromModule(QAnyStringView uri, QAnyStringView typeName)
从uri 指定的模块加载 QML 类型typeName 。如果该类型来自位于远程 url 的 QML 文件,则将异步加载该类型。监听objectCreated 信号可确定对象树何时就绪。
如果发生错误,objectCreated 信号将以空指针作为参数发出,错误信息将以qWarning 打印。
QQmlApplicationEngine engine; engine.loadFromModule("QtQuick", "Rectangle");
注意: uri 所标识的模块会在导入路径中搜索,与在 QML 文件内执行import uri
的方式相同。如果该模块在导入路径中找不到,则此函数将失败。
此函数在 Qt 6.5 中引入。
另请参阅 QQmlComponent::loadFromModule 。
[signal]
void QQmlApplicationEngine::objectCreated(QObject *object, const QUrl &url)
对象加载完成时会发出该信号。如果加载成功,object 包含一个指向已加载对象的指针,否则该指针为 NULL。
此外,还提供了object 所来自组件的url 。
注: 如果组件的路径是以包含相对路径的QString 的形式提供的,则url 将包含完全解析的文件路径。
[signal, since 6.4]
void QQmlApplicationEngine::objectCreationFailed(const QUrl &url)
由于发生错误,加载结束时会发出该信号。
加载失败的组件的url 将作为参数提供。
QGuiApplication app(argc, argv); QQmlApplicationEngine engine; // exit on error QObject::connect(&engine, &QQmlApplicationEngine::objectCreationFailed, &app, []() { QCoreApplication::exit(-1); }, Qt::QueuedConnection); engine.load(QUrl()); return app.exec();
注意: 如果组件的路径是以包含相对路径的QString 的形式提供,则url 将包含完全解析的文件路径。
另请参阅QQmlApplicationEngine::objectCreated ,它将在此信号之外发出(即使创建失败)。
此函数在 Qt 6.4 中引入。
QList<QObject *> QQmlApplicationEngine::rootObjects() const
返回由QQmlApplicationEngine 实例化的所有根对象的列表。其中仅包含通过load() 或方便构造函数加载的对象。
注意: 在 5.9 之前的 Qt 版本中,此函数被标记为非const
。
[slot, since 6.0]
void QQmlApplicationEngine::setExtraFileSelectors(const QStringList &extraFileSelectors)
设置传递给用于解析本地文件 URL 的内部QQmlFileSelector 的extraFileSelectors 。extraFileSelectors 在加载第一个 QML 文件时应用。之后的设置不会产生任何影响。
此函数在 Qt 6.0 中引入。
另请参阅 QQmlFileSelector 和QFileSelector::setExtraSelectors 。
[slot]
void QQmlApplicationEngine::setInitialProperties(const QVariantMap &initialProperties)
设置 QML 组件加载后初始化时使用的initialProperties 。
QQmlApplicationEngine engine; EventDatabase eventDatabase; EventMonitor eventMonitor; engine.setInitialProperties({ { "eventDatabase", QVariant::fromValue(&eventDatabase) }, { "eventMonitor", QVariant::fromValue(&eventMonitor) } });
另请参阅 QQmlComponent::setInitialProperties,QQmlApplicationEngine::load, 和QQmlApplicationEngine::loadData 。
© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.