我有一个基于 QML 的应用程序,它加载了 main.qml
文件系统中的文件,如下所示:
myEngine->load("main.qml");
这工作正常,但我想“重新加载”引擎,以防 main.qml 被更新版本替换。
到目前为止,我尝试的是调用
load()
再次假设引擎会像其他 Qt 类一样自动重置自己。不幸的是,这种情况并非如此。如果我再次调用该方法,将出现另一个窗口,其中包含更新的 qml 文件的内容,而原始窗口保持打开状态并继续显示旧的 qml 文件。
为了解决这个问题,我尝试调用
load(QUrl())
,后跟 clearComponentCache()
以及对新文件的最终加载调用。这导致相同的效果。任何想法如何在应用程序运行时“正确”重新加载 QML 引擎?
最佳答案
刚刚看到这个,但如果你还在想办法解决这个问题 - 这是一个三步过程,你已经掌握了一些。
QQmlApplicationEngine
创建的窗口第一的。就我而言,我将第一个根对象从 QQmlApplicationEngine
中拉出。并将其转换为 QQuickWindow
,然后调用close()
. clearComponentCache
在 QQmlApplicationEngine
. 这就是我的窗口关闭代码所做的(注意我给了我的主窗口一个
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/