我有一个基于QML的应用程序,它从文件系统中加载一个main.qml文件,如下所示:
myEngine->load("main.qml");这很好,但我想“重新加载”引擎,以防main.qml被更新的版本所取代。
到目前为止,我尝试的是再次调用load(),假设引擎将像在其他Qt类中一样自动重置自己。
不幸的是,情况并非如此。如果我再次调用该方法,将出现另一个窗口,其中包含更新的qml文件的内容,而原始窗口将保持打开状态,并继续显示旧的qml文件。
为了解决这个问题,我尝试调用load(QUrl()),然后调用clearComponentCache(),最后对新文件进行加载调用。这就产生了同样的效果。
有什么想法吗?在应用程序运行时,我如何“正确”地重新加载QML引擎?
发布于 2015-05-12 16:35:33
我将尝试将myEngine存储为堆上的指针,并在调用退出()后删除它。然后您可以重构它以获得QML文件的新版本。
如果您出于某种原因不想这样做(例如,因为您希望保持窗口周围或其他地方),您可以尝试使用Loader并以这种方式加载QML文件。这样,您的main.qml就会如下所示:
import QtQuick 2.0
Loader {
source: "changing.qml"
}每当您检测到changing.qml已更改时,只需切换Loader的活动的属性即可触发文件的重新加载。
发布于 2016-03-15 00:43:50
只是看到了这个,但如果你还在努力解决这个问题-这是一个三步的过程,你有一些。
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窗口消失,然后重新出现)。
https://stackoverflow.com/questions/30196113
复制相似问题