Qt:c++ 信号到 qml 连接

Qt: c++ signal to qml connections

我正在尝试学习一些 qt 和 qml,我想制作一个小应用程序,它将监视本地文件的更改并在发生更改时更改 Text 组件。我的代码基于此 answer,但即使在编译期间我没有得到任何 warning/error 和 运行,也将 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"
        }
    }
}

信号 fileChanged 在文件路径发生变化时发出,而不是其内容。

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

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

正如@dtech 已经注意到的那样,

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

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

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

此外,您绝对应该在此处检查 return 结果,如果 returns false.

,则不允许继续进行

像下面这样的东西在这里会更好:

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