首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >正确地重新加载QQmlApplicationEngine

正确地重新加载QQmlApplicationEngine
EN

Stack Overflow用户
提问于 2015-05-12 16:05:01
回答 2查看 3.9K关注 0票数 5

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

代码语言:javascript
复制
myEngine->load("main.qml");

这很好,但我想“重新加载”引擎,以防main.qml被更新的版本所取代。

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

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

为了解决这个问题,我尝试调用load(QUrl()),然后调用clearComponentCache(),最后对新文件进行加载调用。这就产生了同样的效果。

有什么想法吗?在应用程序运行时,我如何“正确”地重新加载QML引擎?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-05-12 16:35:33

我将尝试将myEngine存储为堆上的指针,并在调用退出()后删除它。然后您可以重构它以获得QML文件的新版本。

如果您出于某种原因不想这样做(例如,因为您希望保持窗口周围或其他地方),您可以尝试使用Loader并以这种方式加载QML文件。这样,您的main.qml就会如下所示:

代码语言:javascript
复制
import QtQuick 2.0

Loader {
     source: "changing.qml"
}

每当您检测到changing.qml已更改时,只需切换Loader活动的属性即可触发文件的重新加载。

票数 4
EN

Stack Overflow用户

发布于 2016-03-15 00:43:50

只是看到了这个,但如果你还在努力解决这个问题-这是一个三步的过程,你有一些。

  1. 必须首先关闭由QQmlApplicationEngine创建的窗口。在我的例子中,我从QQmlApplicationEngine中取出第一个根对象,并将其转换为QQuickWindow,然后调用close()
  2. 现在您可以在clearComponentCache上调用QQmlApplicationEngine

这就是我的窗口关闭代码所做的工作(请注意,我给了主窗口一个objectName)

代码语言:javascript
复制
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窗口消失,然后重新出现)。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30196113

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档