2

我发现 QSortFilterProxyModel 在与 QFileSystemModel 一起使用时无法正确过滤。有时它在视图中什么都没有。谁能指出我错在哪里?

#include "MainWindow.h"
#include "ui_MainWindow.h"
#include <QFileSystemModel>
#include <QSortFilterProxyModel>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    QFileSystemModel *fsm = new QFileSystemModel(this);
    fsm->setRootPath(".");

    QSortFilterProxyModel *sfpm = new QSortFilterProxyModel();
    sfpm->setDynamicSortFilter(true);
    sfpm->setSourceModel(fsm);

    ui->tableView->setModel(sfpm);
    ui->tableView->setRootIndex(sfpm->mapFromSource(fsm->index(".")));

    sfpm->setFilterRegExp(QRegExp(".*cpp"));
    sfpm->setFilterKeyColumn(0);
}

MainWindow::~MainWindow()
{
    delete ui;
}

在上面的代码中,如果我使用 QRegExp(".*"),它会显示当前路径中的所有文件。您可以创建一个简单的项目来测试它。

4

1 回答 1

3

我想我已经找到了正确的解决方案。我需要继承 QSortFilterProxyModel 来做一些关于“source_parent”的事情:

class MySortFilterProxyModel : public QSortFilterProxyModel
{
protected:
    virtual bool MySortFilterProxyModel::filterAcceptsRow(
            int source_row, const QModelIndex &source_parent) const{
        QFileSystemModel *sm = qobject_cast<QFileSystemModel*>(sourceModel());
        if (source_parent == sm->index(sm->rootPath())) {    
            return QSortFilterProxyModel::filterAcceptsRow(source_row, source_parent);
        } 
        return true;            
    }
};
于 2012-08-22T02:16:39.390 回答