Qt詹比:QAbstractListModel不显示在QListView中
时间:2020-03-06 14:39:27 来源:igfitidea点击:
我已经在Qt Jambi 4.4中创建了QAbstractListModel类的实现,发现使用带有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);
谁能看到我在做什么错?我想认为这是我的实现存在的问题,因为正如大家所说,选择并没有失败!
解决方案
我没有Jambi的经验,但是我们不应该从方法data()返回QVariant而不是返回Foo吗?我不清楚该视图如何知道如何将Foo转换为显示字符串。
另外,有没有机会我可以向我们出售易于使用的QStandardModel和QStandardModelItem,而不是艰难地推出完全定制的产品?而且,如果只使用一种视图,则可以完全避免使用整个MVC模式,而只需使用非常易于使用的QListWidget。
我们模型的data()实现中存在两个问题:
- 对于不同的项目数据角色,它不能具有不同的值。我们当前的实现为所有角色返回相同的值,并且某些视图可能会遇到问题。
- Jambi中的QVariant与常规Qt中的QVariant不同。当我们没有任何要返回的内容时,只需返回" 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()); }