2017-04-15 1 views
2

J'essaie d'apprendre un peu de qt et qml et je veux faire une petite application qui va surveiller un fichier local pour les changements et modifier un composant Text lorsque des changements se produisent. J'ai basé mon code sur ce answer, mais même si je ne reçois aucun avertissement/erreur pendant la compilation et l'exécution, la connexion du signal fileChanged du QFileSystemWatcher aux éléments qml connections, ne fonctionne pas, ie, le texte ne change pas quand watchedFile.txt est modifié. Comment puis-je vérifier si le signal est reçu dans le code qml?Qt: connexions C++ de signal à qml

Voici mon 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" 
     } 
    } 
} 
+0

« même si je ne reçois pas d'avertissement/erreur lors de la compilation et l'exécution » absence de messages d'avertissement/d'erreur ne signifie pas l'absence d'erreurs. –

Répondre

2

Vous devriez essayer un fichier qui est sur votre système de fichiers. Les fichiers dans les ressources qrc sont intégrés dans l'exécutable, ils ne changent pas. Je ne sais pas exactement ce que vous attendez. Autre que ceci, c'est la manière déclarative que vous faites des connexions à un objet CPP.

+0

Merci, je suppose que je n'avais pas entièrement compris la façon dont fonctionnent les ressources qrc. – Cantfindname

0

Comme @dtech déjà remarqué,

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

est de retour false, parce qrc:/ n'est pas reconnu par watcher chemin comme correct. Et, en fait, ce chemin n'existe pas du tout dans le système de fichiers, car c'est un fichier de ressources interne intégré dans l'exécutable.

Si vous allez mettre le chemin d'accès au fichier sur le disque, votre code fonctionne très bien.

Aussi vous devriez certainement vérifier le résultat de retour ici et ne permettent pas de continuer plus loin, si elle renvoie false.

Quelque chose comme cela devrait fonctionner mieux ici:

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