簡體   English   中英

Qt:C ++信號到QML連接

[英]Qt: c++ signal to qml connections

我試圖學習一些qt和qml,我想做一個小應用程序,它將監視本地文件中的更改並在發生更改時更改Text組件。 我基於此答案編寫代碼,但是即使在編譯和運行過程中未收到任何警告/錯誤,也無法將QFileSystemWatcherfileChanged信號連接到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 ,而不是其內容。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM