QTreeView und Checkboxen

Alles rund um die Programmierung mit Qt
qrk123
Beiträge: 32
Registriert: 4. Dezember 2009 13:19

Beitrag von qrk123 »

Ok, heißt das der Parameter wird immer gleich 0 gesetzt wenn kein Parameter übergeben wird.
und der untere Funktionsaufruf soll eigentlich ein Selbstaufruf sein, wurde aber falschgeschrieben?

Dann hätte ichs verstanden ;)
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

qrk123 hat geschrieben:Ok, heißt das der Parameter wird immer gleich 0 gesetzt wenn kein Parameter übergeben wird.
und der untere Funktionsaufruf soll eigentlich ein Selbstaufruf sein, wurde aber falschgeschrieben?
1) ja
2) Nein. Du hast ja zu dem Zeitpunkt ein parent, wenn du zu einem bestimmten Item die children haben willst. Deshalb setzt du auch "item" als parent ein, denn mit einem "NULL" würdest du wieder mit den TopLevelItems anfangen und hättest für deine Rekursion keine Abbruchbedingung mehr :P
Versuch es doch mal, und freu dich über dein aufgehängtes Programm.

Du kannst jetzt ein kleines Testprogramm schreiben, welches dir nur ein QTreeWidget füllt, ein paar Items checkst und dann per Knopfdruck mit jener Funktion durch deinen Tree "rekursierst". Denn ein Beispiel nur auf dieses eine Problem fixiert wird dich schneller an die Lösung führen, als das alles in dein jetziges Programm zu integrieren.
qrk123
Beiträge: 32
Registriert: 4. Dezember 2009 13:19

Beitrag von qrk123 »

Ich werde immer verwirrter... was ist iterateTreeWidget(treeWidget, item) für eine Funktion? Wenn das keine Selbstaufruf ist, wo ist da überhaupt eine Rekursion? und ferner, falls doch Rekursion. Wo ist die Abbruchbedingung?

:(
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

qrk123 hat geschrieben:Ich werde immer verwirrter...
Sry, mein Fehler ;)
Natürlich sollen iterateTreeItems und iterateTreeWidget die selbe Funktion sein. Und Selbstaufruf hab ich auf das parent als Parameter bezogen (hab den Schreibfehler nicht gesehen und hab zu interpretieren angefangen - immer gefährlich)...
Demnach gilt auch
2) ja
Du hast es verstanden.
Jetzt musst du halt schauen wie du den SegFault wegbekommst.

Und die Abbruchbedingung hast du indirekt, wenn keine children mehr da sind. Dann kommt es zu keinem weiteren Aufruf mehr und iterateTreeItems returniert.
Solltest du also den zweiten Parameter nie angeben, fängst du bei jeder Rekursion wieder bei den topLevelItems an. Wenn die Kinder haben, wird also nie ein Abbruch der Rekursion erreicht.
qrk123
Beiträge: 32
Registriert: 4. Dezember 2009 13:19

Beitrag von qrk123 »

ok, vielen Dank. Werden morgen Gelegenheit haben es zu testen und dann von meinem Erfolg oder Misserfolg berichten :)
brax
Beiträge: 208
Registriert: 11. Mai 2010 11:22

Beitrag von brax »

Sorry, dass ich durch den Schreibfehler für Verwirrung gesorgt habe, hab das mal korrigiert...

Übrigens solltest Du Dir mal die Klasse QTreeWidgetItemIterator angucken.
qrk123
Beiträge: 32
Registriert: 4. Dezember 2009 13:19

Beitrag von qrk123 »

Vielen Dank soweit. Es hat nun alles funktioniert. Die Iterator Klasse ist natürlich super. Schade, dass ich sie vorher nochn icht gesehen hatte.

Ich wollte nun im erzeugten Baum bei jedem hinzufügen eines childs hinter dem Parent anzeigen lassen wie viele childs vorhanden sind.
Probiert habe ich das mit der Zeile:
checked.last()->parent()->setText(1, QString::number(checked.last()->parent()->childCount()));

Habe mich gewundert, dass es nicht geht und bin auf den Bug http://bugreports.qt.nokia.com/browse/QTBUG-4849 gestoßen.

Nach updaten auf die Version 4.6.2 wird das Textfeld aber immernoch nicht geupdatet. Hat jemand eine Idee? Wenn ich das Textfeld abfrage und woanders ausgebe wird das richtige angezeigt. Ist der Bug in 4.6.2 doch nciht behoben?
Antworten