我在Qt Jambi 4.4中创建了QAbstractListModel
类的实现,并且发现使用带有QListView
的模型导致没有显示任何内容,但是使用具有{{1的模型正确显示数据。
以下是我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();
}
}
谁能看到我做错了什么?我想我的实施存在问题,因为正如大家所说,选择不会被打破!
答案 0 :(得分:1)
我在Jambi没有经验,但你不应该从方法数据()返回QVariant而不是返回Foo吗?我不清楚视图如何知道如何将Foo转换为字符串以供显示。
此外,我有机会向您推销更易于使用的QStandardModel和QStandardModelItem,而不是通过艰难的方式滚动完全自定义的QStandardModel和QStandardModelItem吗?如果你只有一个视图,你可以完全避免整个MVC模式,只使用非常容易使用的QListWidget。
答案 1 :(得分:1)
您的模型的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());
}