Domanda

Ho creato un'implementazione della classe QAbstractListModel in Qt Jambi 4.4 e sto scoprendo che l'uso del modello con un QListView non comporta la visualizzazione di nulla, tuttavia usando il il modello con un QTableView visualizza i dati correttamente.

Di seguito è la mia implementazione di 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();
    }
}

Ed ecco come ho impostato il modello:

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);

Qualcuno può vedere cosa sto facendo di sbagliato? Mi piacerebbe pensare che sia stato un problema con la mia implementazione perché, come dicono tutti, selezionare non è rotto!

È stato utile?

Soluzione

Non ho esperienza in Jambi, ma non dovresti restituire un QVariant dai dati del metodo () invece di restituire un Foo? Non mi è chiaro come la vista saprà come convertire Foo in una stringa per la visualizzazione.

Inoltre, hai la possibilità di venderti QStandardModel e QStandardModelItem più facili da usare invece di lanciarne uno completamente personalizzato nel modo più duro? E se hai una sola visione in assoluto, puoi evitare del tutto l'intero modello MVC e usare semplicemente QListWidget molto facile da usare.

Altri suggerimenti

L'implementazione dei dati () del modello presenta due problemi:

  • Non riesce a valori diversi per ruoli ruoli dati articolo diversi. Il tuo attuale l'implementazione restituisce lo stesso valore per tutti i ruoli e alcune viste possono avere problemi con esso.

  • QVariant in Jambi non è lo stesso del Qt normale. Quando non hai nulla da restituire,
    è sufficiente restituire null.

Una migliore implementazione sarebbe:

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());
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top