如何将 qml 文件重新加载到 QQuickView

Posted

技术标签:

【中文标题】如何将 qml 文件重新加载到 QQuickView【英文标题】:How to reload qml file to QQuickView 【发布时间】:2013-06-27 07:45:26 【问题描述】:

将 qml 文件重新加载到 QQuickView 的正确方法是什么?我正在使用 Qt Quick 2.1 并尝试编写一个简单的程序来加载 qml 文件并显示它。目前我正在通过创建一个 QQuickView 来做到这一点,当我想重新加载 qml 文件时,我正在删除旧文件并创建一个新文件。这样做的正确方法是什么?使用新的 qml 文件(或更改的 qml 文件)调用 QQuickView::setSource 对我不起作用。

【问题讨论】:

【参考方案1】:

您可以使用以下内容(假设您在 QQuickView 的子类中):

QUrl tmp = source();
setSource(QUrl());
engine()->clearComponentCache();
setSource(tmp);

【讨论】:

成功了。所以事实证明,如果你将 setSource 与你之前已经使用过的文件一起使用,Qt 会使用它的缓存机制,而不关心你在 qml 文件中所做的更改。如果你想让 QQuickView 重新加载 qml 文件,你需要清除 QQmlEngine 缓存。这真的很有帮助,非常感谢。 该引擎功能出现在文档中以清除整个 Qt Quick 界面中的 all 缓存,如果您只想重新加载单个 QQuickView 项目,这可能是一个问题.听起来对吗? 我在 QML 使用 WebView 并希望销毁所有 cookie 和存储的数据。但是engine()->clearComponentCache();集源(源());没有帮助 我必须在清除组件缓存之前添加setSource(QUrl());,否则主 QML 将无法正确重新加载。我也编辑了答案以执行此操作(如果您觉得这太侵入性编辑,请随时回滚)。【参考方案2】:

你可以按照他的方式去做:

    创建一个 main.qml(名称可以是任何名称)文件,在其中您将实际加载和卸载其他 qml 文件。

    然后使用qml loader element 加载/卸载(如果可能,请刷新)任何其他文件。

【讨论】:

其实我已经尝试过了,但没有成功,因为 QQmlEngine 的缓存机制,它并不关心我在 qml 文件中所做的更改。为了解决这个问题,我需要按照上一个答案中描述的方式清除缓存。

以上是关于如何将 qml 文件重新加载到 QQuickView的主要内容,如果未能解决你的问题,请参考以下文章

保存后重新加载

如何在 Python 中测试 QtQuick Qml

QML 加载,找不到文件

如何加快20-30%的QML加载时间?

如何加载相同的 QML 文件并传递不同的属性

QML:在 GridView 中加载图像