Faire une seule colonne d'un QTreeWidgetItem modifiable
J'ai un QTreeWidgetItem
avec deux colonnes de données, est-il possible de faire seulement la deuxième colonne modifiable? Quand je fais le suivant:
QTreeWidgetItem* item = new QTreeWidgetItem();
item->setFlags(item->flags() | Qt::ItemIsEditable);
toutes les colonnes deviennent modifiables.
InformationsquelleAutor Andreas Brinck | 2010-05-10
Vous devez vous connecter pour publier un commentaire.
Dirait que vous aurez à renoncer à l'aide de
QTreeWidget
etQTreeWidgetItem
et aller avecQTreeView
etQAbstractItemModel
. Le "Widget" classes sont des classes pratiques qui sont des implémentations concrètes de celle, plus abstraite, mais plus souple versions.QAbstractItemModel
a un appelflags(QModelIndex index)
où vous retourne la valeur appropriée pour votre colonne.Vous pouvez faire seulement certaines colonnes dans un QTreeWidget modifiable à l'aide d'une solution de contournement:
1) Définir la editTriggers propriété de la QTreeWidget à NoEditTriggers
2) Sur l'insertion d'éléments, définir l'intervalle Qt:ItemIsEditable drapeau de la QTreeWidgetItem objet
3) le raccordement de l'emplacement à la "itemDoubleClicked" le signal de la QTreeWidget objet:
où "isEditable" est une fonction que vous avez écrit qui retourne vrai pour les colonnes modifiables et false pour les non-modifiable colonnes.
createEditor
à votreQRegExpValidator
. Voir ici pour Qt de discussion et un exemple de comment la sous-classe d'un élément délégué.QTreeWidget::itemChanged
et de mettre en œuvre votre validation. Pour éviter accidentellement la validation d'autres éléments, vous pouvez ajouter un pointeur vers l'élément en cours de modification pour unQSet<QTreeWidgetItem *>
ensemble juste avant l'appel deeditItem
dans ma réponse. Dans le slot connecté àQTreeWidget::itemChanged
, vérifiez si l'élément qui a été modifié est dans cet ensemble. Si elle l'est, effectuer la validation et la retirer de l'ensemble. Si vous avez besoin de plus d'exemple de code complet, veuillez poser une nouvelle question et envoyer un lien à cette question ici.J'ai eu le même problème récemment et a découvert une solution qui fonctionne avec tous les EditTriggers, non seulement l'on double-clique sur l'une (et la connexion à la double cliqué signal)
Créer un Délégué, qui renvoie un Pointeur NULL pour l'éditeur:
Et à utiliser plus tard comme un délégué personnalisé pour votre colonne
index.column()
. Vous pouvez également accéder à la QTreeWidgetItem lui-même par la refonteindex.internalPointer()
à unQTreeWidgetItem*
pour encore plus de contrôle lors de l'édition est bloqué, telles que le blocage d'édition lorsque l'élément a des enfants (comme dans mon cas).Semblent comme la norme de QTreeWidget ne permet pas ceci. Je pense qu'il y a deux façons de le faire:
Utiliser un QTreeView avec votre propre classe dérivée de QAbstractItemModel et de remplacer les drapeaux de la fonction
Utiliser un QTreeView avec un QStandardItemModel. Puis, quand vous ajoutez l'élément viens de mettre la colonne appropriée pour permettre l'édition:
Voici un code pour la deuxième option:
Je trouve la deuxième approche, plus simple mais que tout dépend de la flexibilité que vous voulez avec votre modèle.
La façon la plus simple que j'ai trouvé était à l'utilisation de Qt::ItemFlags
Le haut de la
if
ajoute la fonctionnalité de modification par le biais d'unOR
, et, en bas, vérifie si elle est là, avecAND
, puis l'enlève avec unXOR
.De cette façon, la fonction d'édition est ajouté quand vous le voulez, et supprimé lorsque vous n'en avez pas.
Puis connectez cette fonction à l'arbre du widget
itemDoubleClicked()
signal, et d'écrire votre " afin de modifier ou de ne pas modifier la décision à l'intérieur deisEditable()
Dans le
QTreeWidget
:nullptr
de createEditor() si les colonnes ne doivent pas être modifiés, peut-être dans le cadre de laelse
. Et de définir l'élément de drapeaux àQt::ItemIsEditable
pour les éléments qui doivent être modifiés autrement le délégué ne sera pas appelé.Peut-être un peu en retard, mais il peut aider :
Ici 0 est l'indice de la colonne que vous souhaitez faire readonly.
Définit la ItemIsEditable position à 0 quel que soit le pavillon précédent de votre article.
Sets à 1 quel que soit le pavillon précédent.
Je suis nouveau sur PySide et Python en général, mais j'ai réussi à obtenir que cela fonctionne en vous inscrivant avec le QTreeWidget pour itemClicked rappels. Dans le rappel, cochez la colonne et appeler 'editItem" si c'est pour une colonne que vous souhaitez autoriser la modification.
Par n'est pas en invoquant editItem pour la colonne 0, l'événement est essentiellement jetés.
J'ai découvert que le code ci-dessous fonctionne bien pour mes besoins et qui fait "un peu" arrêter la
utilisateur de modifier certaines parties de colonnes:
En gros, j'ai vérifier rôle et de la colonne. Je ne permettent le montage dans la colonne 0. Donc, si l'utilisateur de les modifier dans une autre colonne, puis-je arrêter la setData modifier et aucun changement n'est fait.
La valeur de l'enfant de l'arbre-widget modifiable ou non(les itmes de l'arbre), en fonction de la ligne et de la colonne.
QTreeWidgetItem::setFlags
ne prend pas de colonne comme un argument. Suis-je censé faire dans leQTreeWidget
, si oui, avec quelle méthode?