Qt Jambi: QAbstractListModel не отображается в QListView - PullRequest
1 голос
/ 24 сентября 2008

Я создал реализацию класса QAbstractListModel в Qt Jambi 4.4 и обнаружил, что при использовании модели с 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);

Кто-нибудь может увидеть, что я делаю не так? Я хотел бы думать, что это была проблема с моей реализацией, потому что, как все говорят, выбор не сломан!

Ответы [ 2 ]

1 голос
/ 05 октября 2009

В реализации вашей модели data () есть две проблемы:

  • Не удается получить разные значения для разных ролей данных элемента. Ваш текущий реализация возвращает одно и то же значение для всех ролей, и некоторые представления могут иметь проблемы с этим.

  • QVariant в Jambi отличается от обычного 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());
}
1 голос
/ 25 сентября 2008

У меня нет опыта работы с Jambi, но разве вы не должны возвращать QVariant из метода data () вместо возврата Foo? Мне не ясно, как представление узнает, как преобразовать Foo в строку для отображения.

Кроме того, есть ли шанс, что я смогу продать вам более простые в использовании QStandardModel и QStandardModelItem вместо того, чтобы накатывать полностью кастомный вариант? И если у вас будет только одно представление, вы можете полностью избежать MVC Pattern и просто использовать очень простой в использовании QListWidget.

...