0

Qt 4.8 を使用しており、1 つ以上のディレクトリ ツリーを表示する GUI を作成しようとしています。QFileSystemModel別のスレッドを使用しているドキュメントを読みました。私はこれを試しました:

QFileSystemModel *model = new QFileSystemModel;
model->setRootPath("C:/");
connect(model, SIGNAL(directoryLoaded(QString)), this, SLOT(alertLoaded(QString)));
ui->treeViewFolders->setModel(model);

ここalertLoadedでは、ディレクトリがロードされたときのメッセージ ダイアログのみを表示します。したがって、ツリーで新しいディレクトリ ブランチを開こうとすると、プロセス中に UI がフリーズしないように、バックグラウンドでディレクトリのアイテムをロードする必要があります。

しかし、問題は、このように動作しないように見えることです。1000 以上のファイル (system32 など) を含むディレクトリを開こうとすると、数秒間フリーズします。明らかにアイコンは読み込みを遅くしていますが、モデルが別のスレッドを使用している場合、なぜフリーズするのでしょうか?

質問:

別のスレッドを本当に使用したい、または別のスレッドを待ちたくないことをモデルに伝えるにはどうすればよいですか?

4

1 に答える 1

0

私の知る限り、 QFileSystemModel は常に別のスレッドを使用します。ファイルリスト全体を取得し、すべてのアイテムを追加するときにレイアウトをリセットしている間、ビューがシステムをロックダウンしているように思えます。投稿は少し古いですが、ここであなたの問題について少し話しています。

QListView を使用すると、同じ遅延が発生しますか? QTreeView の代わりに QListView を使用する場合は、QListView::setLayoutMode()を使用してバッチ モードで実行するように設定できます。

QTreeView が必要な場合は、それをサブクラス化し、QAbstractItemView::scheduleDelayedItemsLayout()を使用してすべてを一度にレイアウトすることを検討してください。

于 2013-03-27T16:29:05.160 に答える