Search code examples
c++qtqmlqt5signals-slots

Qt: c++ signal to qml connections


I am trying to learn a bit of qt and qml and I want to make a small application which will monitor a local file for changes and change a Text component when changes happen. I based my code on this answer, but even though I am not getting any warning/error during compilation and running, connecting the fileChanged signal of the QFileSystemWatcher to the qml connections elements, does not work, i.e., the text does not change when watchedFile.txt is modified. How can I check whether the signal is received in the qml code?

Here is my code:

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"
        }
    }
}

Solution

  • You should try a file that is on your file system. Files in qrc resources are embedded into the executable, they do not change. Not sure what exactly you expect to happen. Other than this, that is the declarative way you do connections to a CPP object.