我正在编写一些代码,每当在其他列表 View 中单击新类别时,该代码就会显示与该类别关联的目录的内容。为了方便起见,我想提供一个过滤器选项,该选项仅显示与给定字符串输入匹配的目录内容。

我所有这些工作都正常进行,但是每当我将过滤器应用于一个类别然后切换到另一个类别时,都会出现一个错误。该过滤器已正确应用于当前正在查看的类别。但是,当我尝试单击另一个类别时,每个类别的每个文件列表都显示为空。仅当我应用过滤器时才会发生此错误,而在不使用过滤器的情况下在类别之间切换时则不会发生。

我以为,“很好,我会在每个类别更改之间添加过滤条件。”所以我尝试了:

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);
}

最佳答案

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

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

10-08 08:37
查看更多