Beispiel für QtreeWidget mit Checkboxen

Code-Stücke können hier veröffentlicht werden.
Antworten
Trubinial Guru
User
Beiträge: 117
Registriert: Dienstag 7. April 2009, 13:40

Hallo, nachdem ich ein wenig daran herumgewerkelt habe, ein QtreeWidget inklusive Ceckboxen zu erstellen und danach alle Einträge mit geklickter checkbox,über den QTreeWidgetItemIterator auszugeben, möchte ich ein vereinfachten Teil des Codes hier veröffentlichen, in der Hoffnung, dass jemand anderem mal helfen wird.

Der Code ist so natürlich nicht lauffähig, da er nur einen Ausschnitt einer Klasse darstellt.

Code: Alles auswählen

#QtreeWidget mit Daten füllen

#Anzahl der Spalten inkl. der Überschriften (Header) festlegen
self.my_tree_widget.setColumnCount(5)
self.my_tree_widget.setHeaderLabels([u' ',u'Name', u'Vorname', u'Adresse', u'Telefonnummer'])

# QTreeWidgetItem erstellen - Es werden die Daten aus einer Liste benutzt
for i in liste:
    itemVoc = QtGui.QTreeWidgetItem(self.my_tree_widget)
    itemVoc.setText(0,'')
    itemVoc.setText(1,i[1])
    itemVoc.setText(2,i[2])
    itemVoc.setText(3,i[3])               
    itemVoc.setText(4,i[4])
    
# Der ersten Spalte die Checkboxen zuweisen und anschließend den Status dieser festlegen
    itemVoc.setFlags(Qt.ItemIsUserCheckable | Qt.ItemIsEnabled | Qt.ItemIsEditable | Qt.ItemIsEditable | Qt.ItemIsEditable)
    itemVoc.setCheckState(0, Qt.Checked)

    self.my_tree_widget.insertTopLevelItem(0, itemVoc)

#Spaltengröße anpassen    
self.my_tree_widget.setColumnWidth(0,45)
self.my_tree_widget.setColumnWidth(1,300)
self.my_tree_widget.setColumnWidth(2,300)
self.my_tree_widget.setColumnWidth(3,70)
self.my_tree_widget.setColumnWidth(4,70)   


# Die Zeilen mit ausgewählter Checkox ausgeben
def widget_inhalt_ausgeben(self):
    it = QtGui.QTreeWidgetItemIterator(self.my_tree_widget,QTreeWidgetItemIterator.Checked)
    while it.value():
       item = it.value()

       erste_spalte = unicode(item.text(1))
       print erste_spalte
       
       it += 1
Liebe Grüße
Zuletzt geändert von Anonymous am Samstag 15. Oktober 2011, 03:14, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
BlackJack

@Trubinial Guru: Ein paar kleine Verbesserungsvorschläge was den Stil betrifft:

”Magische” Zahlen sollte man vermeiden. Wenn die Anzahl der Spalten von der Länge einer Liste mit Überschriften abhängt, sollte man diese Länge nicht getrennt davon hart in den Quelltext schreiben. Man kann das Programm einfacher anpassen, wenn man solche Zahlen zur Laufzeit ermittelt. Das gilt auch für die Quelltextwiederholungen, in denen in jeder Zeile ein Argument hart kodiert hochgezählt wird. Das kann man jeweils mit einer Schleife flexibler gestalten.

Einige der Kommentare sind super trivial, die sollte man weglassen. Kommentare sollten für Sachen verwendet werden, die nicht direkt und einfach aus dem Quelltext ersichtlich sind.

`i` als Laufvariable in einer Schleife sollte man nicht an andere Typen als (ganze) Zahlen binden. Alles andere ist sehr verwirrend für erfahrene Programmierer, weil das neben `j`, `k`, und vielleicht noch `n` und `m` die klassischen Namen für ganze Zahlen sind. Sowohl in der Informatik als auch in der Mathematik.

In Namen sollte man Abkürzungen vermeiden die nicht weitgehend bekannt sind. Was der Zusatz „Voc“ in `itemVoc` bedeuten soll, ist mir zum Beispiel nicht klar!?

*Einmal* `Qt.ItemIsEditable` reicht aus. ;-)

Die `QTreeWidgetItemIterator`-API von PyQt4 ist ja gruselig. Bei PySide hat der Iterator die übliche Python-API für iterierbare Objekte.

Ungetestet:

Code: Alles auswählen

# 
# QtreeWidget mit Daten füllen.
# 

headers = [
    (u' ', 45),
    (u'Name', 300),
    (u'Vorname', 300),
    (u'Adresse', 70),
    (u'Telefonnummer', 70),
]
self.my_tree_widget.setColumnCount(len(headers))
self.my_tree_widget.setHeaderLabels([name for name, width in headers])

for values in liste:
    item = QtGui.QTreeWidgetItem(self.my_tree_widget)
    item.setText(0, '')
    for i, value in enumerate(values):
        item.setText(i + 1, value)
    # 
    # Der ersten Spalte die Checkboxen zuweisen und anschliessend den Status
    # dieser festlegen.
    # 
    item.setFlags(Qt.ItemIsUserCheckable | Qt.ItemIsEnabled | Qt.ItemIsEditable)
    item.setCheckState(0, Qt.Checked)

    self.my_tree_widget.insertTopLevelItem(0, item)

for i, (name, width) in enumerate(headers):
    self.my_tree_widget.setColumnWidth(i, width)

def widget_inhalt_ausgeben(self):
    checked_items = QtGui.QTreeWidgetItemIterator(
        self.my_tree_widget, QTreeWidgetItemIterator.Checked
    )
    # 
    # Funktioniert so mit `PySide`.  Bei `PyQt4` muss man anscheinend an der
    # Stelle C++ in Python schreiben.
    # 
    for item in checked_items:
        print unicode(item.text(1))
Antworten