我目前正在使用 QQmlApplicationEngine加载我的 main.qml 并且工作正常,然后我想切换到 main2.qml(无需在我的 QQmlApplicationEngine 上调用 quit((,因为这会触发 QCoreApplication::exit(( 这将退出我的应用程序(。 所以我只是删除我的引擎,创建一个新的引擎并再次设置上下文属性(main.qml 的上下文属性略有不同(,它加载良好。然后我切换回main.qml(再次加载main.qml(,我开始收到类似警告
qrc:/qml/...: Cannot read property of null
该特定属性在 main.qml 的上下文中为 null,因此这是正确的,但在 main2.qml 的上下文中它不是 null。但我的问题是为什么我在第一次加载 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")));
}
}
我想建议您使用 QML 加载器组件来更改当前的可查看视图。在此页面上,您可以找到一些如何使用加载程序 https://doc.qt.io/qt-5/qml-qtquick-loader.html 的示例。
在这种情况下,您必须为"object1"和"object2"提供上下文属性。