QT:C 信号到QML连接



我正在尝试学习一些QT和QML,我想制作一个小应用程序,该应用程序将在更改时监视更改的本地文件并更改Text组件。我基于此答案的代码,但是即使我在编译和运行过程中没有收到任何警告/错误,将QFileSystemWatcherfileChanged信号连接到QML connections元素,也无法正常工作,即,当watchedFile.txt时,文本不会更改。被修改。我如何检查是否在QML代码中收到信号?

这是我的代码:

c :

int main(int argc, char *argv[]) {
    QGuiApplication app(argc, argv);
    QFileSystemWatcher watcher;
    watcher.addPath(QStringLiteral("qrc:/watchedFile.txt"));
    QQmlApplicationEngine* engine = new QQmlApplicationEngine;
    engine->rootContext()->setContextProperty("cppWatcher", &watcher);
    engine->load(QUrl(QStringLiteral("qrc:/main.qml")));
    return app.exec();
}

qml:

import QtQuick 2.7
import QtQuick.Controls 2.0
ApplicationWindow {
    visible: true
    width: 640
    height: 480
    Text {
        id: text
        text:"TEXT"
    }
    Connections {
        target: cppWatcher
        onFileChanged: {
            text.text = "CHANGED"
        }
    }
}

您应该尝试文件系统上的文件。QRC资源中的文件嵌入了可执行文件中,它们不会更改。不知道您到底期望发生什么。除此之外,这是您与CPP对象连接的声明性方式。

@dtech已经注意到,

watcher.addPath(QStringLiteral("qrc:/watchedFile.txt"));

正在返回false,因为qrc:/未被watcher识别为正确的路径。而且,实际上,该路径在文件系统中根本不存在,因为它是嵌入可执行文件中的内部资源文件。

如果您将文件的路径放在磁盘上,则您的代码工作正常。

您肯定应该在此处检查返回结果,如果返回false

类似以下的事情在这里可以更好地工作:

if (!watcher.addPath(QStringLiteral("C:/your_path/watchedFile.txt")))
    return 1;

当文件路径更改而不是其内容时,信号fileChanged发出。

https://doc.qt.io/qt-5/qfilesystemwatcher.html#filechanged

相关内容

  • 没有找到相关文章

最新更新