0

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

问题:

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

4

1 回答 1

0

AFAIK,QFileSystemModel 总是使用一个单独的线程。在我看来,您的视图在检索整个文件列表并在添加每个项目时重置布局时正在锁定您的系统。帖子有点旧,但他们在这里稍微谈论了你的问题。

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

如果你必须有一个 QTreeView,你可以考虑继承它并使用QAbstractItemView::scheduleDelayedItemsLayout()一次性布局所有内容。

于 2013-03-27T16:29:05.160 回答