【发布时间】:2020-09-09 20:34:24
【问题描述】:
我目前正在使用 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")));
}
}
【问题讨论】:
-
除了重新加载 QML 根文件是一个奇怪的想法和重新创建 QML 引擎(这是一个更奇怪的想法)这一事实之外,为什么不将
QQmlApplicationEngine::load()与新文件一起使用? -
@folibis 重用 QQmlApplicationEngine::load() 是什么意思?只需调用 m_engine->load() 而不重新创建 QML 引擎?
标签: qt qml qqmlengine