c++ - 在 Qt 的 QFileSystemModel 中仅过滤目录和 xml 文件

标签 c++ qt qt5

我已经在

的帮助下实现了自定义文件浏览对话框
QListView
QTreeView
QFileSystemModel

我想要什么!

仅用于浏览 xml 文件的浏览对话框。所以我只想在 QListView 中显示 dirs 和 xml 文件

如果一个目录有 xml 文件,那么 xml 文件将列在该目录下

否则就将目录显示为空(不管它有多少,除了 xml)

在大多数情况下,您正在浏览特定类型的文件。与 MSWord 一样(仅显示 .doc 和 .docx 以供浏览)

我做了什么

m_ptrModelForTree  = new QFileSystemModel(this);
m_ptrModelForTree->setFilter(QDir::Dirs | QDir::NoDotAndDotDot);
m_ptrModelForTree->setRootPath("");
ui->treeView->setModel(m_ptrModelForTree);
ui->treeView->hideColumn(1);
ui->treeView->hideColumn(2);
ui->treeView->hideColumn(3);
ui->treeView->header()->hide();

m_ptrModelForList = new QFileSystemModel(this);
m_ptrModelForList->setFilter(QDir::Files | QDir::Dirs | QDir::NoDotAndDotDot);
m_ptrModelForList->setRootPath("");
ui->listView->setModel(m_ptrModelForList);
ui->listView->setRootIndex(m_ptrModelForList->index("c:\\"));

我得到了什么

显示所有目录和所有文件的对话框(但我只需要显示 xml 文件)

我尝试了什么

m_ptrModelForList->setNameFilters(QStringList()<<".xml");

但它只显示 xml 文件,不显示目录。

请给我建议该怎么做。

最佳答案

实际上这是@Andreas 在对问题的评论中提出的解决方案。 我的贡献是指出名称过滤器中的另一个错误。

解决方案:如何显示所有按扩展名过滤的目录+文件

  1. 使用标志 QDir::AllDirs。根据docs此标志旨在避免将过滤器应用于文件夹。

    setFilter(QDir::Files | QDir::AllDirs | QDir::NoDotAndDotDot);

  2. 使用setNameFilters 为文件设置过滤器。过滤器是 wildcards .
    您使用的错误是将其设置为“.xml”,这意味着文件不应具有其名称,而应仅具有与您的过滤器匹配的扩展名。正确的过滤器是:

    setNameFilters(QStringList() << "*.xml")

关于c++ - 在 Qt 的 QFileSystemModel 中仅过滤目录和 xml 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25927069/

相关文章:

c++ - 一个模板专门化多个类

c++ - 视频不适合 QGraphicsView

qt5 - win 7下为Android部署Qt3D项目

qml - QML中的图像圆角

python - 样式表旋转框的字体无法调整大小

c++ - 在 C++ 的继承上下文中按值传递对象

c++ - 对部分模板特化的说明

c++ - 如何管理 std::list 元素作为引用?

c++ - 将右值引用分配给成员变量

c++ - 从 Qt4 上的另一个表单捕获表单的关闭事件