Qt:C++信号到qml连接

问题描述:

我想学习一点qt和qml,我想制作一个小应用程序,它将监视本地文件的更改并在更改发生时更改Text组件。我的代码是基于answer,但即使我在编译和运行过程中没有收到任何警告/错误,但将QFileSystemWatcherfileChanged信号连接到qml connections元素不起作用,即当watchedFile.txt时文本不会更改被修改。如何检查信号是否在qml代码中收到?Qt:C++信号到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" 
     } 
    } 
} 
+0

“即使我不是在编译过程中得到任何警告/错误并运行”没有预警/错误消息并不意味着没有错误的。 –

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

+0

谢谢,我想我还没有完全理解qrc资源的工作方式。 – Cantfindname

信号fileChanged当文件路径改变被发射的,而不是其内容。

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

+1

错了。 '当指定路径上的文件被修改,重命名或从磁盘上移除时,这个信号被发射出来。' – dtech

+0

好吧,那么我就会感到羞耻。我应该读得更好。 – Alien1993

由于@dtech已经注意到,

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

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

如果你将把文件的路径放在磁盘上,你的代码工作得很好。

此外,你一定要检查返回结果在这里,不允许继续进行,如果它返回false

喜欢的东西下面将更好地工作在这里:

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