問題タブ [qfilesystemwatcher]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
2473 参照

python - PyQt、QFileSystemWatcher が追加されたファイルをキャプチャしない

特定のフォルダーを監視し、新しいファイルがフォルダーに追加されているかどうかを確認する必要があります。その後、ユーザーにファイルを印刷するかどうかを尋ねます。問題は QFileSystemWatcher にあります。追加されたファイルの名前を取得する方法がわかりません。このコードを試してみましたが (後述)、file_changed 関数はフォルダーの変更に反応しません。directory_changed 関数が機能します。

追加されたファイルの名前を取得する方法と、シグナル/ブール値を取得する方法を教えてください。ファイルが追加されたときに、メッセージ ボックスとシステム トレイ メッセージをトリガーできます (コードを参照)。どうもありがとうございました。お粗末なコードで申し訳ありません。私は Qt を初めて使用します。そして、私に C++ の例を教えないでください。私はそれらを理解していません。

0 投票する
2 に答える
975 参照

c++ - QFileSystemWatcher: ファイルがフラッシュされたかどうかを検出する

特定のファイルで新しいデータがいつ利用可能になるかを知る必要がある QT アプリがあります。そこで、信号を使用して、変更があった場合にメッセージを送信する関数にQFileSystemWatcher接続しました。fileChanged

問題は、fileChanged別のアプリケーションがこのファイルをフラッシュしたときにシグナルが送信されず、ファイルが閉じられた後にのみ送信されることです。

ただし、QFileSystemWatcher のドキュメントには、このシグナルは「指定されたパスにあるファイルが変更、名前変更、またはディスクから削除されたときに」発行されると記載されています。多分私は何かが欠けています。にはどのような変更が含まれていmodifiedますか? フラッシュが含まれていない場合、新しいデータがファイルに書き込まれたことをどのように検出できますか?

ソースコードは次のとおりです。

main.cpp

メインウィンドウ.h

メインウィンドウ.cpp

これは、ファイルを変更する別のアプリケーションのコードです (これはサードパーティのアプリなので、同期するように変更することはできません)。

fileChanged()シグナルは後にのみ発行され、呼び出されますが、後ではありませstd::ofstream outfile ("path to file");outfile.close();outfile.flush();

0 投票する
0 に答える
1139 参照

android - Android の QFileSystemWatcher コールバックでファイルにアクセスできない

簡単なウォッチャーを作成し、パスを追加しました。ウォッチャーのシグナルをメソッドに接続しました。

コールバックは次のようになります。

出力は次のとおりです。

最後の行は、通常、ファイルが存在する場合はそのファイルをロードする役割を果たします。コントロールをオーバーライドしようとしてもうまくいきませんでした。ファイル ウォッチャーのコールバック中にファイルを読み取ることはできません

QFileSystemWatcherファイルが変更されたと報告された場合、ファイルを正しく読み取るにはどうすればよいですか? これは意図されたものですか、それともバグですか?

0 投票する
1 に答える
369 参照

c++ - QFileSystemWatcher::directoryChanged をラムダに接続できません

タイトルが示すように、シグナルをラムダに接続しようとしてQFileSystemWatcher::directoryChanged(const QString&)いますが、g ++ (7.2.1) でコンパイルすると、次のエラーが発生します (SO ではあまり多くのコードを投稿できないため、簡略化されています)。

Qt 5.9でコンパイルしています。なぜこれが起こっているのですか?AFAICT私が使用しているラムダは問題ありません。これは私の MWE です。

foo.cpp:

foo.pro:

0 投票する
1 に答える
649 参照

qt - Qt: SQLite データベースで外部の変更をキャッチする

)

経由でアクセスする SQLite データベースを使用してプログラムを開発していますQSqlDatabase。プログラムの実行中にデータベースに何らかの変更が加えられた場合 (まれであることを願っています) を処理したいと思います (たとえば、ユーザーが書き込みアクセスを削除したり、ファイルを移動または削除したり、手動で変更したりする可能性があります)。

を使ってみましたQFileSystemWatcher。データベースファイルを監視させ、何かを書き込むすべての関数で、シグナルをブロックして、「外部」の変更のみが変更されたシグナルをトリガーするようにしました。

問題は、QFileSystemWatcherおよび/または のディスクへの実際の書き込みのチェックが、QSqlDatabase::commit()私が呼び出した正確な瞬間に発生しないように見えることですcommit()。そのため、実際には、最初にQFileSystemWatcherの信号がブロックされ、次にいくつかのものを変更し、次にそれらのブロックを解除して、次に、変更するファイルを報告します。

次に、関数が変更を要求するたびに bool 変数 ( m_writeInProgress)を設定しようとしました。true次に、「変更された」スロットは、書き込みアクションが要求されているかどうかを確認し、要求されている場合は、再度に設定m_writeInProgressして終了します。falseこのようにして、「外部」の変更のみを処理します。

問題は、実際の書き込みが行われている正確な瞬間に変更が発生した場合、それがキャッチされないことです。

おそらく、QFileSystemWatcherこれを実装するために a を使用するのは間違った方法です。

これを安全な方法で行うにはどうすればよいでしょうか。

助けてくれてありがとう!

編集:

問題の一部を解決する方法を見つけました。データベース ファイルの排他ロックを開始すると、他の接続による変更が防止されます。それは非常に簡単です、私はただ実行する必要があります

私のプログラムの別のインスタンスがデータベースにアクセスしようとした場合に発生するエラーを処理します。

残っているのは、実行時にユーザーが(誤って)ファイルを削除したかどうかを知ることです...