如何清除QFileSystemModel中的setNameFilters?

时间:2018-05-06 05:16:29

标签: c++ qt qfilesystemmodel

我正在编写一些代码,只要在不同的列表视图中单击新类别,就会显示与类别关联的目录的内容。为方便起见,我想提供一个过滤选项,它只显示与给定字符串输入匹配的目录内容。

我已经完成了所有这些工作,但每当我将过滤器应用于一个类别,然后切换到另一个类别时,就会出现错误。过滤器适用于我目前正在查看的类别。但是当我尝试点击另一个类别时,每个类别的每个文件列表都显示为空。此错误仅在我应用过滤器时发生,当我在不使用过滤器的情况下在类别之间切换时不会发生此错误。

我想,“没关系,我只是在每个类别更改之间进行过滤。”所以我试过了:

if (filemodel->nameFilters().size() > 0)
{
    // create an empty list of strings to pass to the filter.
    QListString clearFilter;
    filemodel->setNameFilters(clearFilter);
    fileView->setModel(filemodel);
}

可悲的是,这并没有改变行为。我甚至尝试在列表中附加一个空字符串。没变。最终,我不得不求助于以下代码:

if (filemodel->nameFilters().size() > 0)
{
    // throw away the old filemodel and start over with a fresh one.
    delete filemodel;
    filemodel = new QFileSystemModel;
    filemodel->setFilter(QDir::Files);
    filemodel->setRootPath("/");
    fileView->setModel(filemodel);
}

这很有效,但这看起来非常糟糕。我似乎不应该抛弃filemodel并从头开始新的一个。这个问题有更好的解决方案吗?

为了便于参考,以下是与我在MainWindow构造函数中设置方式相关的所有代码,以及我如何实现该方法来进行过滤:

MainWindow::MainWindow(...)
{
    // ... skipping a bunch of stuff
    fileView = new QListView(this);
    filemodel = new QFileSystemModel;
    filemodel->setFilter(QDir::Files);
    filemodel->setRootPath("/");
    fileView->setModel(filemodel);

    filterText = new QLineEdit(this);
    doFilter = new QPushButton(this);
    doFilter->setText("Filter Filenames");
    connect(doFilter, SIGNAL(clicked(bool)), this, SLOT(filterFileView()));
    // ... skipping a bunch of other stuff
}

void MainWindow::filterFileView()
{
    QStringList filterToApply;
    filterToApply.append("*" + filterText->text() + "*");

    filemodel->setNameFilters(filterToApply);
    filemodel->setNameFilterDisables(false);

    fileView->setModel(filemodel);
}

1 个答案:

答案 0 :(得分:0)

将过滤器重置为“ *”对我有用。

QStringList filters;
filters << "*";
filemodel->setNameFilters(filters);