Qt Джамби:QAbstractListModel не отображается в QListView
-
02-07-2019 - |
Вопрос
Я создал реализацию QAbstractListModel
класс в Qt Jambi 4.4 и я нахожу, что использование модели с QListView
приводит к тому, что ничего не отображается, однако использование модели с QTableView
корректно отображает данные.
Ниже приведена моя реализация 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();
}
}
И вот как я устанавливаю модель:
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);
Кто-нибудь может увидеть, что я делаю не так?Мне бы хотелось думать, что это была проблема с моей реализацией, потому что, как все говорят, select не сломан!
Решение
У меня нет опыта работы с Jambi, но разве вы не должны возвращать QVariant из метода data() вместо возврата Foo ?Мне непонятно, откуда представление будет знать, как преобразовать Foo в строку для отображения.
Кроме того, есть ли шанс, что я мог бы продать вам более простые в использовании QStandardModel и QStandardModelItem вместо того, чтобы создавать полностью пользовательские версии сложным способом?И если у вас когда-либо будет только одно представление, вы можете вообще избежать всего шаблона MVC и просто использовать очень-очень простой в использовании QListWidget.
Другие советы
Реализация data() вашей модели сопряжена с двумя проблемами:
Он не принимает разные значения для разных ролей данных элемента.Ваша текущая реализация возвращает одинаковое значение для всех ролей, и в некоторых представлениях могут возникнуть проблемы с этим.
QVariant в Jambi не такой, как в обычном Qt.Когда тебе нечего возвращать,
просто вернисьnull
.
Лучшей реализацией было бы:
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());
}