Как очистить setNameFilters от QFileSystemModel? - PullRequest
0 голосов
/ 06 мая 2018

У меня есть некоторый код, который я пишу, который отображает содержимое каталога, связанного с категорией, всякий раз, когда нажимается новая категория в другом представлении списка. Для удобства я хотел предоставить параметр фильтра, который бы отображал только то содержимое каталога, которое соответствует заданному вводу строки.

У меня все это работает правильно, но есть ошибка, когда я применяю фильтр к одной категории, а затем переключаюсь на другую. Фильтр правильно применяется к категории, которую я сейчас просматриваю. Но когда я пытаюсь нажать на другую категорию, каждый список файлов для каждой категории отображается пустым. Эта ошибка возникает только тогда, когда я применяю фильтр, и не возникает, когда я переключаюсь между категориями, даже не используя фильтр.

Я подумал: «Хорошо, я просто включу фильтр между каждым изменением категории». Итак, я попробовал:

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