gpt4 book ai didi

qt - 正确重新加载 QQmlApplicationEngine

转载 作者:行者123 更新时间:2023-12-04 12:48:04 26 4
gpt4 key购买 nike

我有一个基于 QML 的应用程序,它加载了 main.qml文件系统中的文件,如下所示:

myEngine->load("main.qml");

这工作正常,但我想“重新加载”引擎,以防 main.qml 被更新版本替换。

到目前为止,我尝试的是调用 load()再次假设引擎会像其他 Qt 类一样自动重置自己。

不幸的是,这种情况并非如此。如果我再次调用该方法,将出现另一个窗口,其中包含更新的 qml 文件的内容,而原始窗口保持打开状态并继续显示旧的 qml 文件。

为了解决这个问题,我尝试调用 load(QUrl()) ,后跟 clearComponentCache()以及对新文件的最终加载调用。这导致相同的效果。

任何想法如何在应用程序运行时“正确”重新加载 QML 引擎?

最佳答案

刚刚看到这个,但如果你还在想办法解决这个问题 - 这是一个三步过程,你已经掌握了一些。

  • 您必须关闭 QQmlApplicationEngine 创建的窗口第一的。就我而言,我将第一个根对象从 QQmlApplicationEngine 中拉出。并将其转换为 QQuickWindow ,然后调用close() .
  • 现在您可以调用clearComponentCacheQQmlApplicationEngine .

  • 这就是我的窗口关闭代码所做的(注意我给了我的主窗口一个 objectName )
    QObject* pRootObject = in_pQmlApplicationEngine->rootObjects().first();
    Q_ASSERT( pRootObject != NULL );
    Q_ASSERT( pRootObject->objectName() == "mainWindow" );

    QQuickWindow* pMainWindow = qobject_cast<QQuickWindow*>(pRootObject);
    Q_ASSERT( pMainWindow );
    pMainWindow->close();

    第三步当然是加载你的 QML。

    后来,我开始创建 QQuickView窗口而不是 QQmlApplicationEngine ,这样我就可以调用 clearComponentCache然后 setSource (我不喜欢用户看到 UI 窗口消失然后重新出现。)

    关于qt - 正确重新加载 QQmlApplicationEngine,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30196113/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com