PyQt Arbre Widget, l'ajout de cases à cocher pour la dynamique de suppression
Je cherche à créer un arbre widget qui va essentiellement permettre à l'utilisateur de visualiser les différentes pannes de données et ont la possibilité de supprimer certains articles. Pour ce faire, je veux avoir des cases à cocher associées à chaque élément de niveau supérieur et de chaque enfant, de sorte que l'utilisateur peut sélectionner les éléments de niveau supérieur (et donc tous les enfants de l'élément de niveau supérieur) à supprimer. Ou les enfants à supprimer. Pour vous donner une meilleure idée, j'ai créé un exemple où [x] représente un contrôle de case à cocher et [ ] représente une case vide:
>Beverages Allowed in Stadium [ ]
Soda [ ]
Water [ ]
Tea [ ]
Spirits [X]
Ale [ ]
>Tickets [X]
Row A [X]
Row B [X]
Row C [X]
Lawn [X]
Des suggestions pour mettre en œuvre cette? Je ne sais pas si cela fait une différence en difficulté, mais j'ai attribué une colonne séparée pour la case à cocher.
Vous devez vous connecter pour publier un commentaire.
En plus de la réponse que vous avez fourni, vous pouvez simplifier votre logique à l'aide de la
ItemIsTristate
drapeau sur les éléments parents.Les trois plus importantes lignes de code sont:
Cela on met en place l'élément parent de trois case à cocher état.
Ce, jusqu'à l'enfant d'être sélectionné et de définir la valeur par défaut désactivée. Si l'enfant la case à cocher n'est pas un état, la case de l'élément ne s'affiche pas.
Le code ci-dessus crée un arbre très simple.
Cependant, si je coche une case à cocher sur l'élément parent, tous les enfants sont automatiquement sélectionnés:
Si je souhaite annuler la sélection d'un seul enfant, le parent entre dans la partie sélectionnée (Tri-State):
Si tous les enfants ne sont pas sélectionnées, le parent est automatiquement désactivée. Si le parent n'est pas cochée, tous les enfants sont automatiquement désactivée en tant que bien.
Qt.ItemIsTristate
drapeau et ajouterparent.setCheckState(0, Qt.Unchecked)
(encore une fois, une case à cocher de l'état est nécessaire pour montrer). Cela va ajouter la case à cocher pour le parent. Vous perdez automatique de sélection et désélection des enfants en supprimant le Tristate drapeau bien.root = treeWidget.invisibleRootItem()
for i in range(root.childCount()):
item = root.child(i)
if item.checkState(0, QtCore.Qt.Checked):
# do something or add to list
(PS: je ne sais pas comment faire pour formater ce donc, il a l'air sympa)QTreeWidgetItem
a effectivement intégré dans la case à cocher que vous pouvez utiliser assez facilement.Par exemple:
Ce n'est pas une réponse à votre question, plutôt comment utiliser les cases à cocher une fois que vous les avez. J'ai utilisé l'exemple ci-dessus à partir de la réponse comme correcte. Cela a fonctionné, mais quand j'ai essayé de trouver comment faire pour savoir quelles cases ont été marquées, et j'ai eu beaucoup de problèmes. Après beaucoup de recherche j'ai trouvé une solution qui a fonctionné pour moi, comme je vois qu'il ya pas beaucoup de doc, donc je veux laisser une trace pour l'avenir. Juste pour signaler que j'ai utilisé plusieurs solutions comme invisibleRootItem afin de trouver le enfants du parent, mais cela ne fonctionne pas.
J'ai fini par utiliser la classe QTreeWidgetItemIterator avec un drapeau QtGui.QTreeWidgetItemIterator.Vérifié afin de récupérer le texte de l'cases marquées, et avec ça, je peux continuer à travailler.
le lien vers la documentation http://ftp.ics.uci.edu/pub/centos0/ics-custom-build/BUILD/PyQt-x11-gpl-4.7.2/doc/html/qtreewidgetitemiterator.html et un exemple https://riverbankcomputing.com/pipermail/pyqt/2014-May/034315.html