【问题标题】:QQmlApplicationEngine not completely unloading qml componentsQQmlApplicationEngine 没有完全卸载 qml 组件
【发布时间】: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


【解决方案1】:

我想建议您使用 QML Loader 组件来更改当前的可视视图。在此页面上,您可以找到一些如何使用 Loader(s) https://doc.qt.io/qt-5/qml-qtquick-loader.html 的示例。

在这种情况下,您必须同时为“object1”和“object2”提供上下文属性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-13
    • 2015-12-26
    • 2017-10-03
    • 2014-01-20
    • 1970-01-01
    • 2021-07-10
    • 1970-01-01
    相关资源
    最近更新 更多