当我在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);
答案 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
)是多余的,永远不会正确。失败的唯一方法是,以QString
,because的形式提供qml文件的网址:
注意:如果组件的路径是作为包含相对路径的QString提供的,则url将包含文件的完全解析路径。
但是在那种情况下,终止应用程序不是一个好主意。
随时向Qt开发人员提交错误:)