当我在Qt中创建一个空白的QML应用程序时,IDE会自动创建main.cpp如下所示。我不明白的是为什么在 if 语句中它会检查 obj 和 url?为什么它不只是检查 OBJ?为什么我们首先需要这种检查?
const QUrl url(QStringLiteral("qrc:/main.qml"));
QObject::connect(&engine, &QQmlApplicationEngine::objectCreated, &app, [url](QObject *obj, const QUrl &objUrl) {
if (!obj && url == objUrl)
QCoreApplication::exit(-1);
}, Qt::QueuedConnection);
engine.load(url);
正如你在qt-docs中读到的:
void QQmlApplicationEngine::objectCreated(QObject *object, const QUrl &url)
...对象包含指向已加载对象的指针,否则指针为 NULL。
还提供了对象来自的组件的 URL。
因此,信号QQmlApplicationEngine::objectCreated
将 obj 和 objUrl 传递给 lambda。在 lambda 中,检查 nullptr obj
并检查objUrl
检查它是否从正确的 url 创建。
如果不满足这两个条件之一,则表明对象未正确创建。
我们不需要整个检查。检查obj
是否不是空指针就足够了,因为这意味着load
失败,如文档所述。
第二个检查(url == objUrl
(是多余的,永远不会是真的。失败的唯一方法是,如果 qml 文件的 url 作为QString
提供,因为:
注: 如果组件的路径是作为包含相对路径的 QString 提供的,则 url 将包含文件的完全解析路径。
但在这种情况下,杀死应用程序不是一个好主意。
请随时向Qt开发人员提交错误:)