Qt:c++ 信号到 qml 连接
Qt: c++ signal to qml connections
我正在尝试学习一些 qt 和 qml,我想制作一个小应用程序,它将监视本地文件的更改并在发生更改时更改 Text
组件。我的代码基于此 answer,但即使在编译期间我没有得到任何 warning/error 和 运行,也将 QFileSystemWatcher
的 fileChanged
信号连接到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
在文件路径发生变化时发出,而不是其内容。
您应该尝试使用文件系统上的文件。 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;
我正在尝试学习一些 qt 和 qml,我想制作一个小应用程序,它将监视本地文件的更改并在发生更改时更改 Text
组件。我的代码基于此 answer,但即使在编译期间我没有得到任何 warning/error 和 运行,也将 QFileSystemWatcher
的 fileChanged
信号连接到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
在文件路径发生变化时发出,而不是其内容。
您应该尝试使用文件系统上的文件。 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;