qt - 正确重新加载 QQmlApplicationEngine

标签 qt qml qqmlapplicationengine

我有一个基于 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/

    相关文章:

    c++ - 无法在 MFC 应用程序中显示模态 QProgressDialog

    qt - Qt 中的接口(interface)隔离

    qt - 使用 modeltest 进行 QAbstractItemModel 测试

    python-3.x - 如何将 PyQt5 pyqtSlot 连接到 QML ListView 信号 "activated"?

    c++ - 为什么QQuickWindow-> close()从rootObjects中删除对象?

    linux - 如何在 QML 中编写条件导入语句?

    c++ - 无法在 Qt 6.3 中加载 Qt5Compat.GraphicalEffects 模块

    qt - QQmlListProperty 与 QAbstractListModel

    qt - QML 中的字典

    qt - QQmlApplicationEngine 和 QQuickView 有什么区别?