我目前正在使用 QQmlApplicationEngine 加载我的 main.qml 并且工作正常,然后我想切换到 main2.qml(不调用我的 QQmlApplicationEngine 上的 quit() ,因为这会触发 QCoreApplication::exit() 它将退出我的应用程序)。所以我只是删除我的引擎,创建一个新引擎并再次设置上下文属性(main.qml 的不同上下文属性略有不同),并且加载正常。然后我切换回 main.qml(再次加载 main.qml),我开始收到类似的警告
qrc:/qml/...: Cannot read property of null
该特定属性在 main.qml 的上下文中为空,因此这是正确的,但在 main2.qml 的上下文中它不是空的。但我的问题是为什么我第一次加载 main.qml 时没有收到警告?如果在加载 main2.qml 后加载 main.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")));
}
}