2010-02-11 4 views
3

J'ai une structure de données polymorphique arborescente, où les nœuds sont des instances de classe Node (implémenté par moi) ou une de ses sous-classes. Mon application utilise fortement Boost et les nœuds sont en fait représentés par le type boost :: shared_ptr plutôt que Node*.Liaison d'un modèle Qt à une structure de données existante

Maintenant, je veux créer un modèle Qt pour envelopper ma structure de données arborescente. Par conséquent j'ai besoin d'un moyen d'associer n'importe quel index de modèle avec un noeud dans ma structure de données interne. Et voilà le problème:

Qt prend en charge deux façons de le faire:

Première:

QModelIndex QAbstractItemModel::createIndex (int row, int column, void * ptr = 0) const

crée un index de modèle pour la donnée ligne et colonne avec le interne pointeur ptr.

et seconde:

QModelIndex QAbstractItemModel::createIndex (int row, int column, quint32 id) const

crée un index de modèle pour la donnée ligne et de colonne à l'identifiant interne, id.

Ok, et comment exactement dois-je associer le nœud dans mon cas? Il n'y a aucune possibilité d'associer un shared_ptr à l'index du modèle ... Oui, je sais, je peux recevoir un pointeur brut de mon shared_ptr et le fournir à CreateIndex(), mais ça sent mauvais - me semble trop dangereux.

Des idées? Au fait, je pense qu'en général, l'intégration de Boost/Qt ne semble pas triviale au moins dans le domaine de la gestion de la mémoire.

10x beaucoup.

Répondre

2

Si vous souhaitez effectuer une association simple sans passer un pointeur brut, placez la mémoire partagée dans un conteneur et transmettez la valeur ID de cet élément conteneur dans l'index du modèle. Par exemple, vous pouvez créer déclarer

QMap< quint32, boost::shared_ptr<Foo> > index_map; 

et l'utiliser. Vous devriez faire attention à ne pas dupliquer les identifiants pour les pointeurs existants, peut-être. Cela me semble un peu trop compliqué ...

Vous pouvez également garder une liste des pointeurs (pour assurer une disponibilité continue quand vous en avez besoin), puis utiliser également l'adresse réelle du pointeur dans le QModelIndex. C'est probablement ce que je ferais.

+0

Oui, je vous comprends. Les cartes GUID-pointeur et les pools de mémoire peuvent être utilisés pour résoudre ce problème spécifique. Mais les deux solutions semblent partager le même problème - le look ressemble plus à tenter de "pirater" le problème, au lieu de le résoudre correctement. Si les propositions ci-dessus sont la "bonne" façon de faire les choses avec des modèles QT, alors je dirais que c'est un vrai problème de conception dans l'architecture modèle/vue de QT. – Lev

+0

@Lev: C'est peut-être un problème de conception, mais pas un qui serait très facile à résoudre ... Sinon, comment suggéreriez-vous le suivi * des * types de données que les gens pourraient vouloir mettre dans les arbres?En outre, vous voudrez peut-être examiner ce que les personnes Qt appellent les classes NG ModelView, et voir si elles sont meilleures pour vous: http://qt.nokia.com/developer/learning/online/talks/developerdays2009/ tech-talks/la-next-generation-qt-item-views –

+0

@cjhuitt: lien cassé – Macke

Questions connexes