我是在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"
答案 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);