Qt Jambi: QAbstractListModel non visualizzato in QListView
-
02-07-2019 - |
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!
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 restituirenull
.
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());
}