У меня есть некоторый код, который я пишу, который отображает содержимое каталога, связанного с категорией, всякий раз, когда нажимается новая категория в другом представлении списка. Для удобства я хотел предоставить параметр фильтра, который бы отображал только то содержимое каталога, которое соответствует заданному вводу строки.
У меня все это работает правильно, но есть ошибка, когда я применяю фильтр к одной категории, а затем переключаюсь на другую. Фильтр правильно применяется к категории, которую я сейчас просматриваю. Но когда я пытаюсь нажать на другую категорию, каждый список файлов для каждой категории отображается пустым. Эта ошибка возникает только тогда, когда я применяю фильтр, и не возникает, когда я переключаюсь между категориями, даже не используя фильтр.
Я подумал: «Хорошо, я просто включу фильтр между каждым изменением категории». Итак, я попробовал:
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);
}