2010-08-31 12 views
1

Voici mon cas d'utilisation (très simplifié). J'ai quelques données de DB dans QSQLTableModel et j'ai besoin de le transformer: fusionner quelques champs en un (et afficher en tant que tel) ou diviser un champ en quelques-uns. Comment et où cela devrait-il être fait dans Model/View?Qt4 Modèle/Affichage - Transformation de données dans View?

Notes:

J'ai essayé d'utiliser AbstractProxyModel de le faire, mais je suppose, il est approprié que pour le filtrage ou le tri. Je pourrais allouer de nouvelles données et retourner QModelIndex (qui porte le pointeur vers les données) mais quel objet devrait libérer les données plus tard?

La modification de l'objet View n'aiderait pas non plus car il traite chaque cellule séparément.

Notez que je ne peux pas modifier la base de données de quelque façon que ce soit. Comment faire cela dans Qt? Je passe déjà deux jours entiers sur ceci seulement pour courir dans un mur après l'autre.

Répondre

2

L'utilisation de QAbstractProxyModel n'est pas la mauvaise approche, vous pouvez l'utiliser pour mapper n'importe quel type de modèle source pour restructurer les données. Mais ce sera beaucoup de travail, vous devez ré-implémenter plusieurs méthodes, y compris columnCount, data, flags, index, et plus encore. En effet, vous devez vous assurer que les index de ce modèle correspondent aux données correctes du modèle source. De plus, si vous avez un modèle dynamique, vous voudrez gérer les signaux provenant du modèle source, modifier les valeurs et les réémettre. Si vous souhaitez que la vue modifie également les données, vous devez réimplémenter setData, etc.

Par exemple, si vous avez ajouté une colonne avec deux valeurs et que vous souhaitez les afficher dans deux colonnes distinctes, alors columnCount doit retourner un supplémentaire, data doit récupérer les données d'origine et retourner une seule partie en fonction de la colonne dans l'index, index doit être modifié pour vérifier les nouvelles limites de ce modèle, etc.

Si vous voulez une aide plus spécifique avec ceci, alors s'il vous plaît poster un exemple de code.