1

我已经在 Qt Jambi 4.4 中创建了QAbstractListModel该类的实现,并且发现使用带有 a 的模型QListView不会显示任何内容,但是使用带有 a 的模型可以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);

谁能看到我做错了什么?我想这是我的实现的问题,因为正如每个人所说,选择并没有坏!

4

2 回答 2

1

我在占碑没有经验,但是您不应该从方法 data() 返回 QVariant 而不是返回 Foo 吗?我不清楚视图如何知道如何将 Foo 转换为字符串以进行显示。

此外,我是否有机会向您出售更易于使用的 QStandardModel 和 QStandardModelItem,而不是艰难地推出完全定制的产品?如果你只拥有一个视图,你可以完全避免整个 MVC 模式,而只使用非常非常容易使用的 QListWidget。

于 2008-09-24T23:40:33.227 回答
1

您的模型的 data() 实现有两个问题:

  • 它无法为不同的项目数据角色提供不同的值。您当前的实现为所有角色返回相同的值,并且某些视图可能会出现问题。

  • Jambi 中的 QVariant 与常规 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());
}
于 2009-10-04T22:43:13.390 回答