2009-08-27 2 views
4

Il y a un signal dans QStandardItemModel qui est émis lorsque les données d'un élément sont modifiées. Habituellement, nous connectons un gestionnaire pour ce signal et faisons tout le travail dans la routine gestionnaire. Une telle routine de gestion n'obtient qu'un pointeur vers l'élément. En utilisant ce pointeur, il est possible d'accéder aux données de l'article. Cependant, nous ne savons pas exactement ce qui a changé ... nous avons seulement une valeur mise à jour.Ce qui a changé exactement lorsque QStandardItemModel itemChanged est signalé

Si les données de l'article ont plusieurs rôles, je veux être en mesure d'obtenir exactement quel rôle (données) a été changé et quelle était la valeur précédente.

Répondre

5

En général, QStandardItemModel est pour la modélisation de données très simple. Si vous voulez entrer dans plus de choses avancées comme vous desribe, vous devriez regarder dans subclassing QAbstractItemModel ou l'un de ses dérivés abstraits: Model/View classes

Il peut sembler beaucoup de travail, mais utiliser les exemples et les guides de refernce: Model/View programming, Model subclassing et les récompenses seront super.

+0

Merci pour l'info. Cependant, ce fut une surprise pour moi que nous ne puissions pas hériter directement de QStandardItemModel puisque ses membres ne sont pas virtuels. Est-ce que nous devons toujours implémenter toutes les choses de QAbstractItemModel? – alexkr

+0

Oui, ou l'un de ses dérivés abstraits comme je l'ai dit, par exemple: QAbstractListModel, QAbstractTableModel, QDirModel, QFileSystemModel. L'élément, la liste ou le tableau sont généralement ce que vous utilisez. La liste et la table rendent la vie plus facile si vos données peuvent être représentées de cette façon. Quelque part dans la documentation Qt, il existe également un modèle d'arbre que vous pouvez utiliser comme référence. –

0

Ceci n'est pas possible avec les signaux standard de Qt. Je suggère d'ajouter un autre signal pour cela.

Pour mes propres modèles, j'utilise généralement cette approche: J'ai une instance racine qui contient des pointeurs vers toutes les parties de mon modèle de données. Les éléments de mon modèle utilisent cette instance racine pour envoyer des signaux tels que

itemChanged(item, attribute, oldValue, newValue) 

pour les propriétés simples. La même chose vaut pour les listes et autres; seulement ici, j'ai plusieurs signaux en fonction de l'action, par exemple:

itemAdded(list, item, index) 

[EDIT] Le traitement du signal QT est très basique. Habituellement, cela ne fait que dire "quelque chose a changé". Il n'y a pas de support pour "qu'est-ce qui a exactement changé?" puisque vous n'en avez pas besoin la plupart du temps. Donc, si vous avez besoin de cette information, vous devez le faire vous-même. Vous ne pouvez pas utiliser un rôle seul, car les rôles doivent être sauvegardés par quelque chose dans votre élément. Ce que vous pouvez faire est d'ajouter des informations de modification à vos éléments et de les lire lorsque le rôle est demandé. Mais ce n'est pas quelque chose qui est pris en charge "hors de la boîte".

+0

Probablement je ne comprends pas votre approche. Cela a l'air trop compliqué. Pour moi, il serait plus facile de stocker chaque OldValue en tant que données séparées avec un rôle distinct dans l'élément. De cette façon, je n'ai qu'à comparer et mettre à jour cette valeur pour tout signal itemChanged et j'obtiens tout ce dont j'ai besoin. Je pensais juste qu'il devrait être déjà là dans QT. – alexkr