我正在使用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)时,它会冻结几秒钟。显然图标正在减慢加载速度,但如果模型使用单独的线程,为什么它会冻结?
问题:
我怎么能告诉模型,我真的想要使用一个单独的线程,或者我不想等待另一个线程?
答案 0 :(得分:0)
AFAIK,QFileSystemModel始终使用单独的线程。听起来像你的视图是在检索整个文件列表时锁定你的系统,并在添加每个项目时重置布局。该帖子有点陈旧,但他们会稍微谈谈你的问题here。
如果您使用QListView,您是否有相同的延迟?如果您使用QListView而不是QTreeView,则可以将其设置为使用QListView::setLayoutMode()以批处理模式运行。
如果您必须拥有QTreeView,您可以考虑对其进行子类化并使用QAbstractItemView::scheduleDelayedItemsLayout()一次性布局所有内容。