2017-04-15 13 views
2

qtとqmlの少し勉強しようとしていますが、ローカルファイルの変更を監視し、変更が発生したときにTextコンポーネントを変更する小さなアプリケーションを作りたいと思います。私はこのanswerに私のコードに基づいていましたが、コンパイルと実行中に警告/エラーが発生していなくてもQFileSystemWatcherのシグナルをQFileSystemWatcherのqml connectionsエレメントに接続すると動作しません。つまり、テキストは変更されません。watchedFile.txt変更されます。信号がqmlコードで受信されているかどうかを確認する方法はありますか?qt:qml接続へのQt:C++シグナル

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

警告/エラーメッセージの「私はコンパイル時に警告/エラーを取得し、実行していないのですにもかかわらず、」存在しないことは、エラーがないことを意味するものではありません。 –

答えて

2

あなたは、あなたのファイルシステム上にあるファイルを試してみてください。 qrcリソースのファイルは実行可能ファイルに埋め込まれ、変更されません。正確に何が起こると思いますか。それ以外は、CPPオブジェクトへの接続を宣言的に行う方法です。

+0

ありがとう、私はqrcリソースの仕組みを完全に理解していなかったと思います。 – Cantfindname

-2

ファイルパスを変更した場合、信号fileChangedが放出され、そしてないその内容

は、ここに私のコードです。

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

+1

が間違っています。 'このシグナルは、指定されたパスにあるファイルが変更されたり、名前が変更されたり、ディスクから削除されたときに生成されます。" – dtech

+0

私はよく読むべきだった。 – Alien1993

0

@dtechはすでに気づいたようqrc:/が正しいパスとしてwatcherによって認識されないため、

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

は、falseを返しています。実際、このパスはファイルシステムには存在しません。実行可能ファイルに埋め込まれた内部リソースファイルなのでです。

ファイルのパスをディスクに入れると、コードは正常に動作します。

ここでも返信結果を確認し、falseを返す場合は、先に進めないようにしてください。より良いここに動作します、次のような

何か:

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