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 ),也可以将QCoreApplication 与 QQmlApplicationEngine 配合使用。
与默认QQmlEngine 相比的配置变更列表:
- quit将 Qt XML-ph-0000@deepl.internal() 连接到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(App
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 文件。此功能仅为方便起见,其效果与使用空构造函数并随后调用 load 方法相同。
[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 输出错误消息。
注意:此 插槽是重载的。要连接到此插槽:
// Connect using qOverload:
connect(sender, &SenderClass::signal,
qmlApplicationEngine, qOverload(&QQmlApplicationEngine::load));
// Or using a lambda as wrapper:
connect(sender, &SenderClass::signal,
qmlApplicationEngine, [receiver = qmlApplicationEngine](const QString &filePath) { receiver->load(filePath); }); [slot] void QQmlApplicationEngine::load(const QUrl &url)
加载位于url 的根 QML 文件。对于本地文件 URL,该文件定义的对象树会立即创建。远程 URL 则以异步方式加载,需监听objectCreated 信号以确定对象树何时准备就绪。
如果发生错误,将以空指针作为参数触发objectCreated 信号,并通过qWarning 输出错误消息。
注意:此 插槽被重载。要连接到此插槽:
// Connect using qOverload:
connect(sender, &SenderClass::signal,
qmlApplicationEngine, qOverload(&QQmlApplicationEngine::load));
// Or using a lambda as wrapper:
connect(sender, &SenderClass::signal,
qmlApplicationEngine, [receiver = qmlApplicationEngine](const QUrl &url) { receiver->load(url); }); [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()或便捷构造函数加载的对象。
注意:在 Qt 5.9 之前的版本中,该函数被标记为非const 。
[slot, since 6.0] void QQmlApplicationEngine::setExtraFileSelectors(const QStringList &extraFileSelectors)
设置要传递给内部 `QQmlFileSelector ` 的 `extraFileSelectors `,该 ` ` 用于将 URL 解析为本地文件。这些 `extraFileSelectors ` 在加载第一个 QML 文件时生效。此后设置它们将不会产生效果。
此函数在 Qt 6.0 中引入。
另请参阅 QQmlFileSelector 和QFileSelector::setExtraSelectors 。
[slot] void QQmlApplicationEngine::setInitialProperties(const QVariantMap &initialProperties)
设置initialProperties ,QML组件加载后将使用该 进行初始化。
QQmlApplicationEngine engine;
EventDatabase eventDatabase;
EventMonitor eventMonitor;
engine.setInitialProperties({
{ "eventDatabase", QVariant::fromValue(&eventDatabase) },
{ "eventMonitor", QVariant::fromValue(&eventMonitor) }
});另请参阅 QQmlComponent::setInitialProperties 、QQmlApplicationEngine::load 以及QQmlApplicationEngine::loadData 。
© 2026 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.