4

私のUIは、QFileSystemModelでQTreeViewを使用して、フォルダーとファイルを選択できるようにしています。QFileSystemModel のドキュメントによると、ファイル構造の更新は別のスレッドで行われるため、UI はブロックされません。ただし、これは私には当てはまらず、矛盾や、他の人がこの問題に直面していない理由を理解できません。デバッグ後、ほとんどの時間がかかる QFileSystemModel _q_fileSystemChanged スロットがまだメイン UI スレッドで実行されていることに気付きました。これは理にかなっています。問題は、UI をブロックしないというよりも、ドキュメントがどのように主張しているかです。解決策はありますか?私は何か誤解していますか?

再現するには - QFileSystemDataModel で QTreeView を作成します - ルート パスを "" または "/" に設定します - QFileSystemModel _q_fileSystemChanged スロットにブレークポイントを設定します - アプリのロード後にドライブの 1 つを拡張します

問題: - UI スレッドでスロットが呼び出されるため、終了するまでアプリがブロックされます。

ファイル パーサーを高速化する方法はいくつかありますが、実際には別のスレッドで実行し、データが読み込まれて QTreeView の準備が整ったときに通知する必要があります。

ありがとう、イノケンティ

4

1 に答える 1

4

その理由はアイコンにあると思います。_q_fileSystemChanged()スロット内でfileInfoGatherer.getInfo()呼び出され、特にパスのアイコンを解決します。現在の設計でQFileIconProviderQIcon、アイコンを表すQIconために使用され、UI スレッドでのみ使用できます。他のスレッドで使用できる唯一のクラスのようですが、バックグラウンド スレッドで使用して UI スレッドで に変換するにはQImageコストがかかりすぎると思います。QImageQIcon

そのため、状況によっては、プラットフォームの実装がQFileIconProviderネットワーク パスで遅くなり、UI メイン スレッドが遅くなる可能性があります。

_q_fileSystemChanged()これが問題の原因かどうかはわかりませんが、少なくともUI スレッド内で が呼び出される理由はこれにあるはずです。

于 2010-10-31T09:48:00.153 に答える