【问题标题】:How to clear setNameFilters from a QFileSystemModel?如何从 QFileSystemModel 中清除 setNameFilters?
【发布时间】:2020-04-30 06:02:01
【问题描述】:

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

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

我想,“没关系,我会在每个类别更改之间取消过滤器。”所以我尝试了:

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

【问题讨论】:

  • 我认为如果不能重现问题,或者至少要跟踪代码中 Qt 对象之间的关系,可能很难回答这个问题。我们甚至不知道您使用的是什么视图。
  • 抱歉,fileView 只是一个普通的 QListView。我将修改上面的示例代码。

标签: c++ qt qfilesystemmodel


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-05
    • 2017-03-11
    • 2019-05-08
    • 2015-11-26
    • 1970-01-01
    相关资源
    最近更新 更多