QQmlApplicationEngine не полностью выгружает компоненты qml

В настоящее время я загружаю свой main.qml с помощью QQmlApplicationEngine и отлично работаю, а затем я хочу переключиться на main2.qml (без вызова quit() в моем QQmlApplicationEngine, поскольку это запускает QCoreApplication::exit(), который завершает мое приложение). Поэтому я просто удаляю свой движок, создаю новый и снова устанавливаю свойства контекста (не те же свойства контекста для main.qml, немного другие), и он загружается нормально. Затем я снова переключаюсь на main.qml (снова загружаю main.qml) и начинаю получать предупреждения вроде

qrc:/qml/...: Cannot read property of null

Это конкретное свойство имеет значение NULL в контексте main.qml, так что это правильно, но оно не равно NULL в контексте main2.qml. Но у меня вопрос: почему я не получаю предупреждение при первой загрузке main.qml? Кажется, я получаю предупреждение только в том случае, если загружаю main.qml после того, как загрузил main2.qml.

Ваша помощь очень ценится.

РЕДАКТИРОВАТЬ: вот простой пример кода

QSharedPointer<QQmlApplicationEngine> m_engine;
QQmlContext* m_ctxt;

void loadEngine(int window){
    m_engine->clearComponentCache();
    m_engine.reset(new QQmlApplicationEngine, &QObject::deleteLater);
    m_ctxt = m_engine->rootContext();

    m_ctxt->setParent(m_engine.get());
    QVector<QQmlContext::PropertyPair> qmlProperties;

    qmlProperties.push_back(QQmlContext::PropertyPair{"object", QVariant::fromValue(object)});

    if(window == 1){
        qmlProperties.push_back(QQmlContext::PropertyPair{"object1", QVariant::fromValue(object1)});
        // add more context properties

        m_ctxt->setContextProperties(qmlProperties);
        m_engine->load(QUrl(QLatin1String("qrc:/qml/main.qml")));
    }
    else{    
        qmlProperties.push_back(QQmlContext::PropertyPair{"object2", QVariant::fromValue(object2)});
        // add more context properties

        m_ctxt->setContextProperties(qmlProperties);
        m_engine->load(QUrl(QLatin1String("qrc:/qml/main2.qml")));
    }
}

1 ответ

Я хотел бы порекомендовать вам использовать компонент QML Loader для изменения текущего просматриваемого представления. На этой странице вы можете найти несколько примеров использования загрузчика https://doc.qt.io/qt-5/qml-qtquick-loader.html.

В этом случае вы должны предоставить оба свойства контекста для "object1" и "object2".

Другие вопросы по тегам