使用QFileSystemModel和QSortFilterProxyModel子类过滤特定文件夹的文件

时间:2017-06-08 02:17:03

标签: c++ qt

我正在尝试使用QSortFilterProxyModel过滤QFileSystemModel的文件。问题是,我只想在过滤时显示特定文件夹的内容。通常,如果我只想使用QFileSystemModel显示特定文件夹的内容,我会这样做:

view = new QTreeView(this);
fSystemModel = new QFileSystemModel(this);

view->setModel(fSystemModel);

fSystemModel->setRootPath("C:/Qt");
QModelIndex idx = fSystemModel->index("C:/Qt");

view->setRootIndex(idx);

但是当我使用QSortFilterProxyModel时,索引必须是QSortFilterProxyModel。由于我在Qt Documentation中找不到有关此问题的大量信息,因此我环顾四周并找到this thread。以此为基础,我创建了以下内容:

MainWindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    layout = new QVBoxLayout();
    ui->centralWidget->setLayout(layout);

    view = new QTreeView(this);
    fSystemModel = new QFileSystemModel(this);
    filter = new FilterModel();

    filter->setSourceModel(fSystemModel);

    layout->addWidget(view);
    view->setModel(filter);

    fSystemModel->setRootPath("C:/Qt");
    QModelIndex idx = fSystemModel->index("C:/Qt");
    QModelIndex filterIdx = filter->mapFromSource(idx);

    qDebug() << filterIdx.isValid();

    view->setRootIndex(filterIdx);
}

FilterModel.cpp(QSortFilterProxyModel子类)

#include "filtermodel.h"

bool FilterModel::filterAcceptsRow(int source_row, const QModelIndex &source_parent) const
{
    QModelIndex zIndex = sourceModel()->index(source_row, 0, source_parent);
    QFileSystemModel* fileModel = qobject_cast<QFileSystemModel*>(sourceModel());
    return fileModel->fileName(zIndex).contains("C"); //This line will have custom 
                                                      //filtering behaviour in the future, 
                                                      //instead of the name searching one.
}

但是,当我运行程序时,它不使用指定的根索引。此外,当我使用 qDebug()查看 filterIdx 是否有效时,它会输出false。我做错了什么?

1 个答案:

答案 0 :(得分:1)

尝试查看下一行的结果

qDebug() << idx << " " << fSystemModel->fileName(idx) << " " << filterIdx.isValid();

您可以注意到fSystemModel->fileName(idx)"Qt"(不是完整路径"C:/Qt")。因此,它不会包含您的过滤器"C"中的FilterModel::filterAcceptsRow