QtJambi:QAbstractListModel no se muestra en QListView
-
02-07-2019 - |
Pregunta
He creado una implementación del QAbstractListModel
clase en Qt Jambi 4.4 y encuentro que usar el modelo con un QListView
da como resultado que no se muestre nada, sin embargo, usar el modelo con un QTableView
muestra los datos correctamente.
A continuación se muestra mi implementación de QAbstractListModel
:
public class FooListModel extends QAbstractListModel
{
private List<Foo> _data = new Vector<Foo>();
public FooListModel(List<Foo> data)
{
if (data == null)
{
return;
}
for (Foo foo : data)
{
_data.add(Foo);
}
reset();
}
public Object data(QModelIndex index, int role)
{
if (index.row() < 0 || index.row() >= _data.size())
{
return new QVariant();
}
Foo foo = _data.get(index.row());
if (foo == null)
{
return new QVariant();
}
return foo;
}
public int rowCount(QModelIndex parent)
{
return _data.size();
}
}
Y así es como configuro el modelo:
Foo foo = new Foo();
foo.setName("Foo!");
List<Foo> data = new Vector<Foo>();
data.add(foo);
FooListModel fooListModel = new FooListModel(data);
ui.fooListView.setModel(fooListModel);
ui.fooTableView.setModel(fooListModel);
¿Alguien puede ver lo que estoy haciendo mal?Me gustaría pensar que fue un problema con mi implementación porque, como todos dicen, ¡la selección no está rota!
Solución
No tengo experiencia en Jambi, pero ¿no debería devolver un QVariant del método data() en lugar de devolver un Foo?No me queda claro cómo la vista sabrá cómo convertir Foo en una cadena para su visualización.
Además, ¿hay alguna posibilidad de que pueda venderle QStandardModel y QStandardModelItem, más fáciles de usar, en lugar de lanzar uno totalmente personalizado de la manera más difícil?Y si solo va a tener una vista, puede evitar todo el patrón MVC y simplemente usar QListWidget, que es muy fácil de usar.
Otros consejos
La implementación de datos() de su modelo tiene dos problemas:
No obtiene valores diferentes para diferentes roles de datos de elementos.Su implementación actual devuelve el mismo valor para todos los roles, y algunas vistas pueden tener problemas con él.
QVariant en Jambi no es lo mismo que en Qt normal.Cuando no tienes nada que devolver,
solo regresanull
.
Una mejor implementación sería:
public Object data(QModelIndex index, int role) {
if (index.row() < 0 || index.row() >= _data.size())
return null;
if (role != Qt.ItemDataRole.DisplayRole)
return null;
return _data.get(index.row());
}