QFileSystemModel和QTreeView - 重置视图时的奇怪行为

问题描述:

我在Qt官方论坛上写过这篇文章,但似乎已经死了,所以我要在这里复制粘贴它。QFileSystemModel和QTreeView - 重置视图时的奇怪行为

我正在编写复制文件的小程序。我使用QTreeView,我从QFileSystemModel继承,所以我能够在QTreeView中的每一行添加复选框。我还使用setNameFilters连接QLineEdit的方法,因此用户可以指定他想要在QTreeView中显示哪些文件扩展名。我发现了以下行为:

1)当我运行程序并输入扩展名以进行过滤时(无需触摸QTreeView中的任何节点),一切正常,并且只显示带有扩展名的文件(以及当然文件夹)。当我更改扩展并刷新视图时,在我的"C:/"驱动器上,所有内容都会更新,并且只显示新的扩展集。当我扩展一些之前没有碰到的驱动器时,它也会正确显示文件。

2)当我运行程序并展开让我说我的"C:/""D:/"驱动器我看到所有的目录和文件(预期的行为)。然后我写一些扩展名并刷新视图。我扩大"C:/"驱动器,一切正常,只显示我提供的扩展名的文件。然后我去"D:/"驱动器,这里是问题所在。它显示所有文件。它忽略了我提供的过滤器。当我打开之前没有打开过的驱动器"E:/"时,文件被正确过滤,如"C:/"驱动器。

我得出结论,认为这种行为与setRootPath方法有关,因为对于我的QTreeView只有在"C:/"驱动器中过滤器工作正常。在更换过滤器之前展开的所有其他驱动器都不起作用。那些没有扩大工作就好了。

问题是:如何让这个工作,所以在用户更改过滤器和reset()方法被激发后,整个QTreeView刷新,而不仅是根路径和未扩展的元素?也许存在一些将所有驱动器作为孩子的根路径,它会按预期工作?或者,也许我应该在QTreeView中创建一个名为"MyComputer"的虚拟文件夹,并将其设置为所有驱动器的父级?但如何获得所有可用驱动器的列表?

我希望我写的内容对你很明确,你可以帮助我做到这一点。

编辑: 添加一些相关的代码。如果你需要更多的问题。

//setting up the model and view 
QString rPath = "C:/"; 
rTree_model = new TreeModel(this); //TreeModel inherits from QFileSystemModel 
rTree_model->setRootPath(rPath); 

ui->rTree->setModel(rTree_model); //applies the model for the qtreeview (ui->rTree) 

//(...) 

//action when extensions were provided by user 
QString extensions = QString(ui->extensionBox->text()); //gets extensions provided by user 
QStringList filters; 
if(extensions.length() > 0) { 
    filters = extensions.split(";", QString::SkipEmptyParts); //splits extensions provided with ';' as separator 
    rTree_model->setNameFilters(filters); //applies filters 
    ui->rTree->reset(); //resets the view 
} 
+0

你可以发布一些代码来帮助我们重现你的问题吗? –

+0

@Riateche在这里,你去。 – sobol6803

+0

TreeModel :: reset()是做什么的?它只是默认的实现吗? – Phlucious

尝试将您的根路径更改为我的电脑而不是C:/。它似乎与Windows 7 x64和Qt 4.8.2中的QFileSystemModel一起工作,但我无法保证其他平台的任何功能。

rTree_model = new TreeModel(this); 
QString rPath = model->myComputer().toString(); //causes the QFileSystemWatcher to watch every drive? 
rTree_model->setRootPath(rPath); 

ui->rTree->setModel(rTree_model); 
+0

你太棒了!:)我知道这是有道路的东西,但我不知道,有一个'myComputer()'方法。我想如果我有更多的时间,我会最终找到它。无论如何,它现在有效,你得到赏金(14小时,现在不能完成)。你已经赢得了! :) – sobol6803

+0

很高兴它的工作!顺便说一下,不知道你最初发布的是哪个Qt论坛,但是我的问题在qtcentre.org上已经取得了一些成功。 – Phlucious

+0

我已将它发布在qt-project.org官方论坛上。感谢您的建议,我会看看这个网站。 :) – sobol6803