我正在尝试使用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。我做错了什么?
答案 0 :(得分:1)
尝试查看下一行的结果
qDebug() << idx << " " << fSystemModel->fileName(idx) << " " << filterIdx.isValid();
您可以注意到fSystemModel->fileName(idx)
是"Qt"
(不是完整路径"C:/Qt"
)。因此,它不会包含您的过滤器"C"
中的FilterModel::filterAcceptsRow
。