0

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

我正在编写用于复制文件的小程序。我使用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
}
4

1 回答 1

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);
于 2013-06-26T20:21:30.370 回答