首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QML没有显示对.qml文件的更改

QML没有显示对.qml文件的更改
EN

Stack Overflow用户
提问于 2013-10-26 08:19:24
回答 2查看 6.3K关注 0票数 14

我有main.qmldynamic.qml文件,我想使用Loader {}main.qml上加载dynamic.qml

dynamic.qml文件的内容是动态的,另一个程序可能会更改其内容并覆盖它。因此,我编写了一些C++代码,用于检测文件中的更改并触发信号。

我的问题是,我不知道如何才能强迫装载机重新加载文件。

这是我目前的工作:

代码语言:javascript
复制
MainController {
    id: mainController
    onInstallationHelpChanged: {
        helpLoader.source = "";
        helpLoader.source = "../dynamic.qml";
    }
}

Loader {
    id: helpLoader

    anchors.fill: parent
    anchors.margins: 60
    source: "../dynamic.qml"
}

我认为QML引擎缓存dynamic.qml文件。因此,每当我想重新加载加载器时,它都会显示旧的内容。有什么建议吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-10-26 08:58:59

在将加载器trimComponentCache()属性设置为空字符串后,需要在QQmlEngine上调用source。换言之:

代码语言:javascript
复制
helpLoader.source = "";
// call trimComponentCache() here!!!
helpLoader.source = "../dynamic.qml";

为了做到这一点,您需要向QML公开一些C++对象,该对象具有对您的QQmlEngine的引用(在Qt和StackOverflow中有很多示例来帮助实现这一点)。

trimComponentCache告诉QML忘记它现在使用的所有组件,只做您想做的事情。

更新-更详细地解释:

例如,在某个地方定义了一个类,该类接受指向QQmlEngine的指针并公开trimComponentCache方法:

代码语言:javascript
复制
class ComponentCacheManager : public QObject {
    Q_OBJECT
public:
    ComponentCacheManager(QQmlEngine *engine) : engine(engine) { }

    Q_INVOKABLE void trim() { engine->trimComponentCache(); }

private:
    QQmlEngine *engine;
};

然后,在创建QQuickView时,将上面的一个绑定为上下文属性:

代码语言:javascript
复制
QQuickView *view = new QQuickView(...);
...
view->rootContext()->setContextProperty(QStringLiteral("componentCache", new ComponentCacheManager(view->engine());

然后,在您的QML中,您可以执行如下操作:

代码语言:javascript
复制
helpLoader.source = "";
componentCache.trim();
helpLoader.source = "../dynamic.qml";
票数 13
EN

Stack Overflow用户

发布于 2016-08-10 21:22:44

我希望有一个纯粹的QML解决方案。我注意到loader.source是一个url (file:///),并记住了如何在请求中使用?t=Date.now()来避免HTTP缓存。尝试将?t=1234添加到loader.source的末尾,果然,它可以工作。

代码语言:javascript
复制
import QtQuick 2.0

Item {
    Loader {
        id: loader
        anchors.fill: parent
        property string filename: "User.qml"
        source: filename

        function reload() {
            source = filename + "?t=" + Date.now()
        }
    }

    Timer {
        id: reloadTimer
        interval: 2000
        repeat: true
        running: true
        onTriggered: {
            loader.reload();
        }
    }
}

我还编写了另一个示例,它将在使用XMLHttpRequest触发重新加载之前检查文件内容的更改。

代码语言:javascript
复制
import QtQuick 2.0

Item {
    Loader {
        id: loader
        anchors.fill: parent
        property string filename: "AppletUser.qml"
        property string fileContents: ""
        source: ""

        function reload() {
            source = filename + "?t=" + Date.now()
        }

        function checkForChange() {
            var req = new XMLHttpRequest();
            req.onreadystatechange = function() {
                if (req.readyState === 4) {
                    if (loader.fileContents != req.responseText) {
                        loader.fileContents = req.responseText;
                        loader.reload();
                    }
                }
            }
            req.open("GET", loader.filename, true);
            req.send();
        }

        onLoaded: {
            console.log(source)
        }

        Timer {
            id: reloadTimer
            interval: 2000
            repeat: true
            running: true
            onTriggered: loader.checkForChange()
        }

        Component.onCompleted: {
            loader.checkForChange()
        }
    }

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

https://stackoverflow.com/questions/19604552

复制
相关文章

相似问题

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