2017-03-31 6 views
0

Ich habe ein QTreeWidget mit zwei Ebenen. Elternebene ist die erste und untergeordnete Ebene darunter. Ich möchte, dass die übergeordnete Ebene Kontrollkästchen enthält, aber ich möchte, dass die untergeordneten Elemente keine Kontrollkästchen haben. Im folgenden Beispiel zeigt jedes QTreeWidgetItem ein Ankreuzfeld an. Wenn ich "child.setCheckState (0, Qt.Unchecked)" entferne, verschwinden alle Kontrollkästchen, nicht nur die untergeordneten Kontrollkästchen.QTreeWidgetItem ausblenden untergeordnete Kontrollkästchen, aber nicht übergeordnete Kontrollkästchen

Wie kann ich die untergeordneten Kontrollkästchen, nicht aber die übergeordneten Kontrollkästchen, ausblenden?

from PyQt4.QtCore import * 
from PyQt4.QtGui import * 
import sys 

def main(): 
    app  = QApplication (sys.argv) 
    tree  = QTreeWidget() 
    headerItem = QTreeWidgetItem() 
    item  = QTreeWidgetItem() 

    for i in xrange(2): 
     parent = QTreeWidgetItem(tree) 
     parent.setText(0, "Parent {}".format(i)) 
     parent.setFlags(parent.flags() | Qt.ItemIsTristate | Qt.ItemIsUserCheckable) 
     parent.setExpanded(True) 
     parent.setCheckState(0, Qt.Unchecked) 
     for x in xrange(3): 
      child = QTreeWidgetItem(parent) 
      child.setFlags(child.flags() & ~(Qt.ItemIsSelectable | Qt.ItemIsUserCheckable)) 
      child.setText(0, "Child {}".format(x)) 
      #child.setCheckState(0, Qt.Unchecked) 
    tree.show() 
    sys.exit(app.exec_()) 

if __name__ == '__main__': 
    main() 

Antwort

1

Hier "child.setCheckState (0, Qt.Unchecked)" - bedeutet, dass "Sie Kontrollkästchen in Spalte" 0 "mit deaktiviertem Status setzen".

Jetzt Ihren Code erneut:

Sie es nicht für Eltern setzen, die Sie so tun, wie unten etwas wollen:

Set Checkbox für Eltern Artikel:

parent.setCheckState(0, Qt.Unchecked) 

Entfernen Sie unter dem Code vollständig, da es Kontrollkästchen für Kind setzt, die Sie nicht wollen

Löschen Sie auch die Flags-Einstellung, wie wir festgestellt haben Einstellung Flags zu übergeordneten, werden zu untergeordneten Elementen durchgeführt.

Der Code sieht grob so etwas wie dies in erster for-Schleife:

 parent = QTreeWidgetItem(tree) 
     parent.setText(0, "Parent {}".format(i)) 
     parent.setExpanded(True) 
     parent.setCheckState(0, Qt.Unchecked) 
     for x in xrange(3): 
      child = QTreeWidgetItem(parent) 
      child.setText(0, "Child {}".format(x)) 
+0

Guter Fang. Mein Beispielcode stimmt nicht mit meinem echten Code überein. Ich habe Ihren Vorschlag und den Vorschlag von m7913d meinem obigen Beispiel hinzugefügt. Leider ist das untergeordnete Kontrollkästchen immer noch sichtbar. – panofish

+0

haben Sie den Code "child.setCheckState (0, Qt.Unchecked)" vollständig entfernt – Naidu

+0

Ich sehe immer noch "child.setCheckState (0, Qt.Unchecked)" in Ihrem Code. Bitte entfernen Sie es vollständig – Naidu

0

Sie sollten die unter der Flagge ItemIsUserChechable und ItemIsSelectable von Ihrem Kind flags statt mit ihnen entfernen:

child.setFlags(child.flags() & ~(Qt.ItemIsSelectable | Qt.ItemIsUserCheckable)) 

Ich würde auch erwarten, dass Sie nicht die check des Kindes einstellen sollen, aber das des Elternteils. Weitere Informationen zu binären Operationen finden Sie unter python documentation.

+0

Guter Fang. Mein Beispielcode stimmt nicht mit meinem echten Code überein. Ich habe Ihren Vorschlag und den Vorschlag von Pavanc meinem Beispiel oben hinzugefügt. Leider ist das untergeordnete Kontrollkästchen immer noch sichtbar. Ihr Vorschlag verhindert, dass ich es überprüfe, aber es versteckt das Kontrollkästchen nicht. – panofish

Verwandte Themen