Deseo crear un campo de búsqueda que filtre los elementos que se muestran en un QListView. Básicamente, el usuario puede escribir "foo" y solo se muestran los elementos con "foo" en DisplayRole.Creación de un campo de búsqueda QLineEdit para elementos visualizados en un QListView
ya tengo algunas ideas sobre cómo hacer esto, pero pensé en preguntar los más experimentados que yo
Mi idea sería utilizar algunas señales y ranuras para establecer un filtro en el modelo QAbstractItem y activa una actualización() en QListView.
¿Hay algún método de ayuda en QListView para el filtrado que pude haber omitido?
¿Hay una manera canónica de manejar esto que no he encontrado?
edición
progreso actual.
Creé una ranura pública llamada "updateFilter (QString)" en mi subclase QFileSystemModel. Entonces
connect(myQLineEditSearch, SIGNAL(textChanged(QString)),
myQFileSysModel, SLOT(updateFilter(QString)));
Esto establece el filtro, entonces en mi QFileSystemModel :: método de datos (...), que tiene:
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;
}
Esto es casi allí. El "error" en el que estoy trabajando tiene que ver con el lugar donde se muestra el objeto. Actualmente, si aplico una búsqueda que coincida con el tercer elemento de la lista, solo las primeras dos filas se mostrarán en blanco. En otras palabras, aún representa las filas para elementos no coincidentes.
Esto se ve bien, pero también se ve depende de que el usuario manualmente haciendo clic en un botón de búsqueda o algo así.Estoy tratando de obtener actualizaciones en vivo para la qlistview. Actualicé mi publicación para reflejar mi progreso actual. – jkyle