Pergunta

Eu criei uma implementação da classe QAbstractListModel em Qt Jambi 4.4 e estou achando que usando o modelo com um QListView resultado em nada que está sendo exibido, no entanto, utilizando o modelo com um QTableView exibe os dados corretamente.

Abaixo está minha implementação do 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();
    }
}

E aqui está como eu definir o modelo de:

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

Alguém pode ver o que estou fazendo de errado? Eu gostaria de pensar que era um problema com minha implementação, porque, como todo mundo diz, selecione não está quebrado!

Foi útil?

Solução

Eu não sou experiente em Jambi, mas você não deveria estar retornando um QVariant a partir de dados do método () em vez de retornar um Foo? Não está claro para mim como a visão vai saber como converter o Foo em uma seqüência para exibição.

Além disso, qualquer chance que eu poderia vender-lhe o uso mais fácil de QStandardModel e QStandardModelItem em vez de rolar um a maneira totalmente personalizada um disco? E se você está indo só para ter uma visão cada vez, você pode evitar todo o padrão MVC completamente e apenas usar o muito, muito fácil de usar QListWidget.

Outras dicas

dados do seu modelo () implementação tem dois problemas nele:

  • Ela falha em valores diferentes para diferentes papéis de dados item. seu atual implementação retorna o mesmo valor para todas as funções, e alguns pontos de vista pode ter problemas com ele.

  • QVariant em Jambi não é o mesmo que em Qt regular. Quando você não tem nada para retorno,
    apenas null retornar.

Uma implementação melhor seria:

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());
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top