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

时间:2013-06-23 13:45:18

标签: c++ qt qt5 qtreeview qfilesystemmodel

我是在Qt的官方论坛上写的,但它似乎已经死了,所以我打算将它复制粘贴到这里。

我正在编写用于复制文件的小程序。我使用QTreeView并且继承自QFileSystemModel,因此我可以为QTreeView中的每一行添加复选框。我还使用与setNameFilters相关联的QLineEdit方法,因此用户可以指定要在QTreeView中显示的文件扩展名。我发现了以下行为:

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

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

我的结论是,此行为与setRootPath方法有关,因为仅QTreeView驱动器中的"C:/"过滤器才能正常工作。在更改过滤器之前展开的所有其他驱动器都不起作用。那些没有扩展的工作就好了。

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

我希望我写的内容对你来说很清楚,你可以帮助我实现这个目标。

修改 添加一些相关的代码。如果您需要更多,请询问。

"MyComputer"

1 个答案:

答案 0 :(得分:2)

尝试将根路径更改为“我的电脑”而不是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);