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!

¿Fue útil?

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 regresa null.

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());
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top