我正在使用QTreeView + QFileSystemModel在Qt程序中显示文件夹的内容。
现在,我想隐藏该视图的特定项目。显示规则不是基于文件名的,因此我不能使用setNameFilters()。我所拥有的是QModelIndex的简单列表,其中包含我要隐藏的所有项目。是否可以仅使用此列表来过滤视图?
在我的研究中,我遇到了QSortFilterProxyModel类,但是我不知道如何使用它来实现我想要的。任何帮助将不胜感激。
答案 0 :(得分:0)
子类QSortFilterProxyModel
的子类,并覆盖方法filterAcceptsRow
来设置过滤器逻辑。
例如,要过滤当前用户的写权限:
class PermissionsFilterProxy: public QSortFilterProxyModel
{
public:
PermissionsFilterProxy(QObject* parent=nullptr): QSortFilterProxyModel(parent)
{}
bool filterAcceptsRow(int sourceRow,
const QModelIndex &sourceParent) const
{
QModelIndex index = sourceModel()->index(sourceRow, 0, sourceParent);
QFileDevice::Permissions permissions = static_cast<QFileDevice::Permissions>(index.data(QFileSystemModel::FilePermissions).toInt());
return permissions.testFlag(QFileDevice::WriteUser); // Ok if user can write
}
};
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QFileSystemModel* model = new QFileSystemModel();
model->setRootPath(".");
QTreeView* view = new QTreeView();
PermissionsFilterProxy* proxy = new PermissionsFilterProxy();
proxy->setSourceModel(model);
view->setModel(proxy);
view->show();
return app.exec();
}