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