来自 C++ 插件的 QML 类型仅发出一次信号

Posted

技术标签:

【中文标题】来自 C++ 插件的 QML 类型仅发出一次信号【英文标题】:QML type from C++ Plugin signaling only once 【发布时间】:2016-01-28 22:59:57 【问题描述】:

我有一个 C++ 插件,它使用 QFileSystemWatcher 监视文件更改,并将它的 fileChanged 信号与自定义 QML 类型插槽连接起来,如下所示:

//In the custom QML type constructor
QObject::connect(&this->_watcher, SIGNAL(fileChanged(QString)),
                        this, SLOT(fileChangedSlot(QString)));

槽函数:

void CustomQMLTypeClass::fileChangedSlot(QString file)

    Q_UNUSED(file);
    emit fileChanged();

在 QML 方面:

CustomQMLType
    fileUri: "some/file/path/file.format"
    onFileChanged: console.log("File changed")

运行程序时一切正常,但当我运行时,即:

echo "sth" >> some/file/path/file.format

不止一次,通知只触发一次。为什么?哎哟

【问题讨论】:

【参考方案1】:

显然问题出在QFileSystemWatcher,它有时有效,而另一些则无效。 由于我可以承受成本,我的快速解决方案是更改插槽:

void CustomQMLTypeClass::fileChangedSlot(QString &file)

    _watcher.removePath(file);
    _watcher.addPath(file);
    emit fileChanged();

现在它按预期工作,但不知道为什么,也无法理解QFileSystemWatcher's source。最后我认为 KDE 的KDirWatch 更好。

【讨论】:

以上是关于来自 C++ 插件的 QML 类型仅发出一次信号的主要内容,如果未能解决你的问题,请参考以下文章

[Qt Quick 踩坑] QML端函数参数未定义

QML 插槽中未收到 C++ 信号

从 C++ (Qt5) 向 QML 项目发送信号

Qml 注册类型的构造函数中的发射信号不起作用

如何使用QMetaObject :: activate发出信号

将 qml 信号连接到 Qt