Вопрос

Я создал реализацию 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);

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

Это было полезно?

Решение

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

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

Другие советы

Реализация 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());
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top