我正在使用QT4.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)的目录时,它会冻结几秒钟。很明显,图标正在减缓加载速度,但是如果模型使用的是单独的线程,为什么会冻结呢?
问题:
我如何告诉模型,我真的想使用一个单独的线程,或者我不想等待另一个线程?
发布于 2013-03-27 16:29:05
QFileSystemModel总是使用一个单独的线程。在我看来,您的视图正在锁定系统,同时检索整个文件列表,并在添加每个项时重置布局。这篇文章有点旧,但他们谈论你的问题有点这里。
如果使用QListView,是否有相同的延迟?如果使用QListView而不是QTreeView,则可以将其设置为以批处理模式与QListView::setLayoutMode()一起运行。
如果您必须拥有一个QTreeView,您可以考虑对它进行子类化,并使用QAbstractItemView::scheduleDelayedItemsLayout()一次性地布局所有内容。
https://stackoverflow.com/questions/15661696
复制相似问题