Почему Qt проверяет создание приложений QML таким образом? - PullRequest
0 голосов
/ 17 июня 2019

Когда я создаю пустое приложение QML в Qt, 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 голосов
/ 18 июня 2019

Нам не нужен весь этот чек.Было бы достаточно проверить, не является ли obj нулевым указателем, поскольку это означало бы, что load не удалось, как говорится в документации.

Вторая проверка (url == objUrl) является излишней и никогда не будетбыть правдой.Единственный способ, из-за которого это не получается, - это если файл URL-адреса в qml был указан как QString, , поскольку :

Примечание. Если путь к компоненту был указан какQString, содержащий относительный путь, URL будет содержать полностью разрешенный путь к файлу.

Но в этом случае было бы плохой идеей уничтожить приложение.

Не стесняйтесь отправлять сообщение об ошибке в Qt devs:)

0 голосов
/ 18 июня 2019

Как вы можете прочитать в qt-docs :

void QQmlApplicationEngine::objectCreated(QObject *object, const QUrl &url)
... объект содержит указатель на загруженный объект, в противном случае указатель равен NULL.
Также указывается URL-адрес компонента, из которого получен объект.

Таким образом, сигнал QQmlApplicationEngine::objectCreated передает obj и objUrl к лямбде. В лямбде obj проверяется на nullptr и objUrl проверяется, был ли он создан из правильного URL.
Если одно из двух условий не выполнено, вы знаете, что объект был создан неправильно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...