Я хочу создать поле поиска, которое фильтрует элементы, показанные в QListView. Обычно пользователь может ввести «foo», и отображаются только элементы с «foo» в DisplayRole.
У меня уже есть несколько идей о том, как это сделать, но я решил спросить тех, кто опытнее меня.
Моя идея состоит в том, чтобы использовать некоторые сигналы и слоты для установки фильтра в модели QAbstractItem и запуска обновления () в QListView.
Есть ли в QListView вспомогательные методы для фильтрации, которые я мог пропустить?
Есть ли канонический способ справиться с этим, с которым я не сталкивался?
1012 * редактировать *
Текущий прогресс.
Я создал публичный слот с именем «updateFilter (QString)» в моем подклассе QFileSystemModel. Тогда я
connect(myQLineEditSearch, SIGNAL(textChanged(QString)),
myQFileSysModel, SLOT(updateFilter(QString)));
Это устанавливает фильтр, затем в моем методе QFileSystemModel :: data (...), у меня есть:
void ComponentModel::updateFilter(QString filter)
{
_filter = filter;
emit layoutChanged();
}
QVariant ComponentModel::data(const QModelIndex &index, int role) const
{
QVariant result;
// if our search filter term is set and the item does not match,
// do not display item data. Searches are case insensitive
if (!_filter.isEmpty() &&
!QFileSystemModel::data(index, Qt::DisplayRole)
.toString().toLower().contains(_filter.toLower()))
{
return result;
}
result = QFileSystemModel::data(index, role);
return result;
}
Это почти там. «Глюк», над которым я работаю, связан с тем, где отображается объект. В настоящее время, если я применяю поиск, который соответствует 3-му элементу в списке, только первые две строки отображаются как пустые. Другими словами, он по-прежнему отображает строки для несопоставленных элементов.