2017-02-22 5 views
0

Je suis un débutant avec la programmation Model/View de Qt et j'ai lu le Editable Tree Model Example dans la documentation de Qt. La caractéristique intéressante dans cet exemple est qu'un seul objet (TreeItem) encapsule deux éléments d'information qui sont affichés plus tard dans une seule ligne contenant deux colonnes (name et description) grâce à l'annulation de QModelIndex QAbstractItemModel::index et QVariant QAbstractItemModel::data.Est-ce que deux objets QStandardItem peuvent gérer différents attributs du même objet?

Maintenant, j'ai aussi une classe personnalisée (par exemple Foo) contenant deux éléments d'information (Foo::m_name et Foo::m_description) que je veux afficher dans une seule ligne contenant deux colonnes, mais au lieu de subclassing QAbstractItemModel que je veux sous-classe QStandardItemModel parce que il a beaucoup de fonctionnalités. Cependant, il semble que je dois créer deux objets QStandardItem pour chacun de mes objets Foo, un pour gérer m_name et un autre pour gérer m_description. Comment puis-je conserver un seul objet Foo en mémoire et faire référence à ces deux objets QStandardItem?

Dans ma question, il y a l'hypothèse implicite qu'il faut créer un objet QStandardItem pour chaque paire (ligne, colonne). S'il vous plaît laissez-moi savoir si c'est faux.

Répondre

0

A post in qtcentre suggéré Chapitre 4 Advanced Qt Programming et voilà, il y a une discussion sur un arbre subsclassing QstandardItemModel et QStandardIteml où chaque ligne de l'arbre est composé de trois propriétés différentes QstandardItem la manipulation d'un seul objet. Le code source de mise en œuvre est freely available

En gros, on a:

class myItem : public QStandardItem { 
public: 
    myItem(Foo &afoo) : QStandardItem(afoo.getName()), m_foo(afoo) { 
    m_description = new QStandardItem(afoo.getDescription()); 
    } 
    QstandardItem *m_description; // display m_description 
private: 
    Foo &m_foo;  
}; 

puis nous insérer une ligne de deux QstandardItem dans notre arbre modèle

class myModel: public QStandardItemModel { 

    StandardItem *myModel::appendRow(QStandardItem *parent, Foo &afoo) 
    { 
     auto *doublet = new myItem(afoo); 
     parent->appendRow(QList<QStandardItem*>() << doublet 
       << double->m_description); 
     return nameItem; 
    } 
} 
0

QStandardItemModel est tout au sujet de stocker les données dans le modèle, de sorte que chaque cellule est représentée par un QStandardItem qui contient les données de cette cellule.

Si les données sont déjà stockées ailleurs et ne doivent pas être dupliquées, alors la QStandardItemModel est la mauvaise approche et un modèle personnalisé est la voie à suivre. Un modèle personnalisé, dans le cas d'une structure arborescente dérivée de QAbstractItemModel, est simplement une interface entre la vue et les données, de sorte que les données ne résident qu'une seule fois en mémoire.

+0

j'avais déclaré 'Q_DECLARE_METATYPE (Foo *) 'et stocké un' QVariant 'dans le' QStandardItem' pour éviter de stocker l'objet 'Foo'. Cependant, cela m'a conduit à devoir instancier deux objets 'QStandardItem' pour chaque objet' Foo', et j'espérais qu'il y avait une solution de contournement. – jmborr

+0

Comme je l'ai dit: le 'QStandardItemModel' utilise un QStandardItem par cellule comme principe de conception. Son cas d'utilisation est de stocker des données dans le modèle plutôt que d'être une interface avec des données stockées ailleurs. –