QFileSystemModel freezes UI

QFileSystemModel freezes UI

本文关键字:UI freezes QFileSystemModel      更新时间:2023-10-16

我正在使用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)时,它会冻结几秒钟。显然,图标减慢了加载速度,但如果模型使用的是单独的线程,为什么会冻结?

:

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

当然,QFileSystemModel总是使用一个单独的线程。在我看来,您的视图在检索整个文件列表并在添加每个项目时重置布局时锁定了系统。这篇文章有点老了,但他们在这里讨论了你的问题。

如果你使用QListView,你有同样的延迟吗?如果你使用QListView而不是QTreeView,你可以使用QListView::setLayoutMode()设置它以批处理模式运行。

如果你必须有一个QTreeView,你可以考虑子类化它,并使用QAbstractItemView::scheduleDelayedItemsLayout()来一次布局一切