QTreeView und Checkboxen
QTreeView und Checkboxen
Hallo,
im Moment versuche ich gerade herauszufinden, wie man eine Liste aller QtreeItemWidgets erhält, bei denen die CHeckbox markiert ist.
Erster Versuch war über das signal "itemChanged" des TreeWidgets und sah so aus:
connect( ui.treeWidget, SIGNAL( itemChanged( QTreeWidgetItem* item, int column ) ), SLOT( itemChecked( ) ) );
Allerdings wird itemChecked() nie ausgelöst, egal was man selektiert.
Zweiter Versuch:
Iterieren über alle Items vom TreeWidget. Allerdings scheiter ich hier schon dabei heraus zufinden wie ich alle items ansteuere, wobei die Abfrage dann ob sie selektiert wären wohl kein Problem ist.
Weiß Jemand an wie ich zumindest einen dieser Ansätze durchführen könnte? würde mich freuen.
vielen Dank
im Moment versuche ich gerade herauszufinden, wie man eine Liste aller QtreeItemWidgets erhält, bei denen die CHeckbox markiert ist.
Erster Versuch war über das signal "itemChanged" des TreeWidgets und sah so aus:
connect( ui.treeWidget, SIGNAL( itemChanged( QTreeWidgetItem* item, int column ) ), SLOT( itemChecked( ) ) );
Allerdings wird itemChecked() nie ausgelöst, egal was man selektiert.
Zweiter Versuch:
Iterieren über alle Items vom TreeWidget. Allerdings scheiter ich hier schon dabei heraus zufinden wie ich alle items ansteuere, wobei die Abfrage dann ob sie selektiert wären wohl kein Problem ist.
Weiß Jemand an wie ich zumindest einen dieser Ansätze durchführen könnte? würde mich freuen.
vielen Dank
Zuletzt geändert von qrk123 am 26. Mai 2010 11:55, insgesamt 1-mal geändert.
-
stefanborries
- Beiträge: 6
- Registriert: 29. Oktober 2009 11:58
Alle Items durchsuchen
Man könnte:
- alle top-level Items durchsuchen (topLevelItemCount + topLevelItem ( int index )).
- Für jedes top-level item geht man die children durch (childCount + child ( int index )). Natürlich muss man auch für jedes child nach weiteren children suchen.
- Bei jedem QTreeWidgetItem untersucht man ob es gecheckt ist.
So bekommt man seine Liste.
Das ist jetzt aber nur so dahin geschrieben. Es gibt sicher performantere Wege.
- alle top-level Items durchsuchen (topLevelItemCount + topLevelItem ( int index )).
- Für jedes top-level item geht man die children durch (childCount + child ( int index )). Natürlich muss man auch für jedes child nach weiteren children suchen.
- Bei jedem QTreeWidgetItem untersucht man ob es gecheckt ist.
So bekommt man seine Liste.
Das ist jetzt aber nur so dahin geschrieben. Es gibt sicher performantere Wege.
Versuch das connect mal so:
Oder noch besser, Du änderst Deinen itemChecked() slot, dass er auch noch das Item und die Column bekommt:
Zum Iterieren über die Items würde ich folgendes probieren:
Code: Alles auswählen
connect( ui.treeWidget, SIGNAL( itemChanged( QTreeWidgetItem*, int) ), this, SLOT( itemChecked( ) ) );
Code: Alles auswählen
connect( ui.treeWidget, SIGNAL( itemChanged( QTreeWidgetItem*, int) ), this, SLOT( itemChecked( QTreeWidgetItem*, int ) ) );
Code: Alles auswählen
void iterateTreeItems(QTreeWidget* treeWidget, QTreeWidgetItem *parent = 0)
{
int count = parent ? parent->childCount() : treeWidget->topLevelItemCount();
for (int i = 0; i < count; i++)
{
QTreeWidgetItem *item = parent ? parent->child(i) : treeWidget->topLevelItem(i);
iterateTreeItems(treeWidget, item);
}
}
Zuletzt geändert von brax am 27. Mai 2010 12:00, insgesamt 1-mal geändert.
Hallo,
ich habe das gerade nocheinmal ausprobiert. Bei der Signalmethode wird itemchecked() immernoch nicht aufgerufen.
Und bei dem zweiten Beispiel versteh ich nicht ganz wofür der Parentparameter da ist und warum er in der Parameterliste mit 0 initialisiert wird. Was muss ich der Funktion als Parameter für Parent übergeben?
Ich hab probiert den Checkstate folgender Maßen zu überprüfen
if(item->checkState(0))
checkedItems << item;
Dabei stürzt das Program aber regelmäßig ab. Ist das falsch? geht es anders?
Steh grad wirklich aufm Schlauch
vielen Dank
ich habe das gerade nocheinmal ausprobiert. Bei der Signalmethode wird itemchecked() immernoch nicht aufgerufen.
Und bei dem zweiten Beispiel versteh ich nicht ganz wofür der Parentparameter da ist und warum er in der Parameterliste mit 0 initialisiert wird. Was muss ich der Funktion als Parameter für Parent übergeben?
Ich hab probiert den Checkstate folgender Maßen zu überprüfen
if(item->checkState(0))
checkedItems << item;
Dabei stürzt das Program aber regelmäßig ab. Ist das falsch? geht es anders?
Steh grad wirklich aufm Schlauch
vielen Dank
Der sagt "Unbehandelte Ausnahme bei 0x6571d006 (QtGuid4.dll) in Composer.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0x00000000." 
Kann vielleicht jemand diese beiden Zeilen erläutern?
int count = parent ? parent->childCount() : treeWidget->topLevelItemCount();
QTreeWidgetItem *item = parent ? parent->child(i) : treeWidget->topLevelItem(i);
Versteh ich leider nicht
Kann vielleicht jemand diese beiden Zeilen erläutern?
int count = parent ? parent->childCount() : treeWidget->topLevelItemCount();
QTreeWidgetItem *item = parent ? parent->child(i) : treeWidget->topLevelItem(i);
Versteh ich leider nicht
Das sagt dir zu allererst dass du irgendwo auf einen Zeiger zugreifen willst, der mit NULL initialisiert ist. Das führt zu der Zugriffsverletzung.qrk123 hat geschrieben:Ich glaube, das heißt in diesem Fall, dass ein Parent des Items nicht existiert und er beim Versuch des Zugriffes darauf scheitert. Aber wissen tu ichs nicht.
Du schaust jetzt mit dem Debugger, an welcher Stelle genau die Verletzung ausgelöst wird (Callstack/Backtrace). Mit dem Debugger kannst du dir auch den Inhalt der einzelnen Variablen anschauen, vllt. wirst du da schlauer
Da wir den exakten Code nicht vor uns haben, können wir auch nur Tips geben, wie du den Fehler selber finden kannst .
Die Itemliste wird in der Funktion scheinbar nicht richtig gesetzt.
Das Programm scheitert nämlich beim ausführen von:
checkedItems.last()->parent()->text(0);
ein checkedItems.last() existiert, scheinbar nur das Parent nciht.
Könnte mir nochmal Jemand etwas zu den beiden Codezeilen aus der Funktion sagen? Count ist bei mir wohl immer der Wert 1. Kann das sein?
Ich kann vielleicht nochmal sagen was ich allgemein machen möchte. Mein Ziel ist es in mehreren verschiedenen Trees items zu markieren und aus denen dann einen einzelnen neuen Tree zusammen zu bauen. Ich hoff das kann so funktionieren.
Das Programm scheitert nämlich beim ausführen von:
checkedItems.last()->parent()->text(0);
ein checkedItems.last() existiert, scheinbar nur das Parent nciht.
Könnte mir nochmal Jemand etwas zu den beiden Codezeilen aus der Funktion sagen? Count ist bei mir wohl immer der Wert 1. Kann das sein?
Ich kann vielleicht nochmal sagen was ich allgemein machen möchte. Mein Ziel ist es in mehreren verschiedenen Trees items zu markieren und aus denen dann einen einzelnen neuen Tree zusammen zu bauen. Ich hoff das kann so funktionieren.
Der Hintergedanke ist, dass man das Ding auch rekursiv verwenden kann.qrk123 hat geschrieben:Die Schreibweise verstehe ich, aber ich kann mit dem Übergabeparamter parent nicht viel anfangen. Warum wird der auf 0 gesetzt in der Parameterliste? Wofür braucht man den überhaupt?
Das "=0" nennt man Default-Parameter, und macht hier speziell mit Pointern Sinn. Wenn das Ding "0" ist, soll das rootItem (also die topLevelItems) genommen werden, ansonsten wird angenommen, parent (der Parameter!) ist valid und von diesem aus werden die childItems iteriert.
Du hast ja eine Baumstruktur, und da macht Rekursion zum tiefen Iterieren Sinn.