QFileSystemModel冻结UI

时间:2013-03-27 14:42:11

标签: c++ windows multithreading qt

我正在使用Qt 4.8并尝试创建一个显示一个或多个目录树的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)时,它会冻结几秒钟。显然图标正在减慢加载速度,但如果模型使用单独的线程,为什么它会冻结?

问题:

我怎么能告诉模型,我真的想要使用一个单独的线程,或者我不想等待另一个线程?

1 个答案:

答案 0 :(得分:0)

AFAIK,QFileSystemModel始终使用单独的线程。听起来像你的视图是在检索整个文件列表时锁定你的系统,并在添加每个项目时重置布局。该帖子有点陈旧,但他们会稍微谈谈你的问题here

如果您使用QListView,您是否有相同的延迟?如果您使用QListView而不是QTreeView,则可以将其设置为使用QListView::setLayoutMode()以批处理模式运行。

如果您必须拥有QTreeView,您可以考虑对其进行子类化并使用QAbstractItemView::scheduleDelayedItemsLayout()一次性布局所有内容。