【问题标题】:Qt: c++ signal to qml connectionsQt:c++ 信号到 qml 连接
【发布时间】:2017-04-15 13:07:30
【问题描述】:

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

【问题讨论】:

  • “即使我在编译和运行期间没有收到任何警告/错误”没有警告/错误消息并不意味着没有错误。

标签: c++ qt qml qt5 signals-slots


【解决方案1】:

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

【讨论】:

  • 谢谢,我想我还没有完全理解 qrc 资源的工作方式。
【解决方案2】:

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

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

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

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

另外,你绝对应该在这里检查返回结果,如果返回false,则不允许继续进行。

以下内容在这里会更好:

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 错了。 This signal is emitted when the file at the specified path is modified, renamed or removed from disk.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多