为什么Qt以这种方式检查QML应用程序的创建



当我在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开发人员提交错误:)

最新更新