2010-04-22 6 views
1

Quelqu'un at-il un exemple d'utilisation d'un QWidget en tant qu'éditeur dans un QAbstractTableModel?
J'ai une colonne qui, lorsqu'elle est éditée, devrait créer un QCombobox avec la liste de choix.Éditeur personnalisé dans QAbstractTableModel

Les documents semblent suggérer que j'ai besoin d'écrire un QAbstractItemDelegate et une fonction de peinture personnalisée, mais cela semble trop simple pour faire apparaître un QCombobox standard dans Qt :: EditRole. Remarque: le contenu de la zone de liste déroulante est le même pour chaque ligne et doit être affiché uniquement lorsque quelqu'un clique dans la cellule. Je sais que cela devrait être simple, mais je n'arrive pas à le faire fonctionner. C'est facile pour une table basée sur QTableWidget - mais j'en ai besoin pour une très grande table de données.

Répondre

4

Les documents semblent indiquer que je dois écrire un QAbstractItemDelegate et une fonction de peinture personnalisée, mais qui semble exagéré de pop-up simplement un QComboBox standard dans Qt :: EditRole.

Vous n'avez pas besoin d'aller aussi loin. Une façon est de sous-classer QStyledItemDelegate puis de surcharger createEditor() afin qu'il renvoie votre zone de liste modifiable pré-remplie. Ses fonctions setEditorData et setModelData suffiront probablement déjà si vous utilisez des types de valeur de base Qt.

Si vous avez besoin de quelque chose de plus générique qui fonctionne sur de nombreux modèles différents, vous pouvez créer un QItemEditorFactory qui associe votre éditeur au type correct. Cela fonctionne également bien avec les types personnalisés.

Lorsqu'il est indiqué par EditTrigger de votre vue, votre vue sera obtenir le délégué spécifique à la cellule sur laquelle l'édition est invoquée et appeler delegate->createEditor(...) qui peut alors dimensionner la zone de liste déroulante en fonction du paramètre options ainsi que définir l'entrée en cours à la valeur spécifiée par le modèle, bien que la plupart de ceci devrait être manipulé par le QStyledItemDelegate. Ainsi, vous n'aurez pas à vous soucier du Qt::EditRole directement car la vue va gérer cela.

+0

Merci d'avoir aidé - comment puis-je réellement connecter le délégué dans Qt :: Editrole dans QAbstractTableModel? –

+0

La réponse a été mise à jour pour expliquer comment l'édition est invoquée. –

+0

C'est ce que je pensais mais ça ne fonctionnait pas. J'ai trouvé l'exemple de spinbox - une fois que vous m'avez donné le "QStyledItemDelegate" merci –

1

Avez-vous essayer de jeter un oeil à l'exemple suivant de Qt:

Spin Box Delegate Example

Peut-être vous donnera une vision beaucoup plus claire sur le sujet!

J'espère que ça aide un peu!

+0

Merci - l'ai trouvé juste après avoir posté le commentaire! –