[英]Qt: c++ signal to qml connections
我試圖學習一些qt和qml,我想做一個小應用程序,它將監視本地文件中的更改並在發生更改時更改Text
組件。 我基於此答案編寫代碼,但是即使在編譯和運行過程中未收到任何警告/錯誤,也無法將QFileSystemWatcher
的fileChanged
信號連接到fileChanged
connections
元素,即,當watchedFile.txt
時文本不會更改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"
}
}
}
您應該嘗試使用文件系統上的文件。 qrc資源中的文件嵌入到可執行文件中,它們不會更改。 不知道您期望發生什么。 除此之外,這是您與CPP對象建立連接的聲明方式。
正如@dtech已經注意到的那樣,
watcher.addPath(QStringLiteral("qrc:/watchedFile.txt"));
將返回false
,因為qrc:/
不被認可的watcher
為正確的路徑。 而且,實際上,此路徑在文件系統中根本不存在,因為它是嵌入在可執行文件中的內部資源文件。
如果將文件路徑放在磁盤上,則代碼可以正常工作。
另外,您絕對應該在此處檢查返回結果,並且如果返回false
,則不允許繼續進行。
如下所示的方法在這里會更好:
if (!watcher.addPath(QStringLiteral("C:/your_path/watchedFile.txt")))
return 1;
當文件路徑更改時,將發出信號fileChanged
,而不是其內容。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.