【问题标题】:Qt Jambi: QAbstractListModel not displaying in QListViewQt Jambi:QAbstractListModel 未在 QListView 中显示
【发布时间】:2008-09-24 12:17:12
【问题描述】:

我在 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);

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

【问题讨论】:

    标签: java qt qt-jambi qabstractlistmodel


    【解决方案1】:

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

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

    【讨论】:

    • 最后选择了 QStandardModel。感谢您的建议。容易多了!
    【解决方案2】:

    您的模型的 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());
    }
    

    【讨论】:

      猜你喜欢
      • 2011-06-29
      • 2012-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-06
      • 1970-01-01
      • 2020-01-16
      相关资源
      最近更新 更多