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".