Question

J'ai créé une implémentation de la classe QAbstractListModel dans Qt Jambi 4.4 et je constate qu'en utilisant le modèle avec un QListView , rien ne s'affiche, mais l'utilisation de la modèle avec QTableView affiche les données correctement.

Ci-dessous, ma mise en œuvre de 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();
    }
}

Et voici comment définir le modèle:

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

Quelqu'un peut-il voir ce que je fais mal? J'aimerais penser que mon implémentation posait un problème car, comme tout le monde le dit, sélectionnez n'est pas cassé!

Était-ce utile?

La solution

Je ne connais pas bien Jambi, mais ne devriez-vous pas renvoyer une variable QVariant à partir de la méthode data () au lieu de renvoyer un Foo? Je ne vois pas comment la vue va savoir comment convertir le Foo en chaîne d'affichage.

De plus, avez-vous une chance que je puisse vous vendre les outils QStandardModel et QStandardModelItem plus faciles à utiliser au lieu de lancer un jeu entièrement personnalisé à la dure? Et si vous n’avez qu’une seule vue, vous pouvez éviter complètement le modèle MVC et utiliser le très facile à utiliser QListWidget.

Autres conseils

L'implémentation data () de votre modèle présente deux problèmes:

  • Les valeurs pour les différents rôles de données d'élément n'aboutissent pas. Votre courant l’implémentation renvoie la même valeur pour tous les rôles et certaines vues peuvent avoir problèmes avec elle.

  • QVariant dans Jambi n’est pas le même que dans Qt normal. Quand vous n'avez rien à revenir,
    il suffit de renvoyer null .

Une meilleure implémentation serait:

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());
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top