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

时间:2019-06-17 17:56:57

标签: 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);

2 个答案:

答案 0 :(得分:0)

您可以在qt-docs中阅读

  

void QQmlApplicationEngine::objectCreated(QObject *object, const QUrl &url)
  ... object包含一个指向已加载对象的指针,否则指针为NULL。
  还提供了对象所属组件的URL。

因此,信号QQmlApplicationEngine::objectCreated将obj和objUrl传递给lambda。在lambda中,检查obj是否为nullptr并检查objUrl是否是从正确的url创建的。
如果不满足这两个条件之一,则说明对象创建不正确。

答案 1 :(得分:0)

我们不需要整个检查。如文档所述,检查obj是否不是空指针就足够了,因为那将意味着load失败。

第二张支票(url == objUrl)是多余的,永远不会正确。失败的唯一方法是,以QStringbecause的形式提供qml文件的网址:

  

注意:如果组件的路径是作为包含相对路径的QString提供的,则url将包含文件的完全解析路径。

但是在那种情况下,终止应用程序不是一个好主意。

随时向Qt开发人员提交错误:)