[gelöst] Elemente einer QListView reparenten
[gelöst] Elemente einer QListView reparenten
Hi,
Ich habe schon einige, weniger effiziente Versuche hinter mir, ein Element aus einer QListView unter ein neues Top-Level Element zu Stellen und wollte nun fragen wie ihr das machen würdet, bzw. wie die Referenzlösung dafür aussieht.
Zur Veranschaulichung ein Beispiel was ich möchte:
Element1
+--- Element1.1
+--- Element1.2
+--- Element1.3
Element2
Element3
Element4
Element1.2 soll nun unter Elemen3 sein, also:
Element1
+--- Element1.1
+--- Element1.3
Element2
Element3
+--- Element1.2
Element4
Mfg,
Alex
Ich habe schon einige, weniger effiziente Versuche hinter mir, ein Element aus einer QListView unter ein neues Top-Level Element zu Stellen und wollte nun fragen wie ihr das machen würdet, bzw. wie die Referenzlösung dafür aussieht.
Zur Veranschaulichung ein Beispiel was ich möchte:
Element1
+--- Element1.1
+--- Element1.2
+--- Element1.3
Element2
Element3
Element4
Element1.2 soll nun unter Elemen3 sein, also:
Element1
+--- Element1.1
+--- Element1.3
Element2
Element3
+--- Element1.2
Element4
Mfg,
Alex
-
FlorianBecker
- Beiträge: 1213
- Registriert: 2. Dezember 2004 10:54
- Kontaktdaten:
-
ArneStocker
- Beiträge: 300
- Registriert: 3. November 2004 16:15
- Wohnort: Berlin
Hallo
wenn ich Dich richtig verstanden habe, willst Du ein bestehendes Item 'umsortieren' ohne es zu löschen
und
allerdings darst Du in der Zwischenzeit so gut wie nichts mit dem Item machen. Einfacher ist es sicherlich, den entsprechenden Baum zu deleten und neu aufzubauen.
Der Zeitverlust gegenüber dem take und insert ist (je nach Anzahl der Items) zu vernachlässigen.
Gruss Arne
wenn ich Dich richtig verstanden habe, willst Du ein bestehendes Item 'umsortieren' ohne es zu löschen
Code: Alles auswählen
QListViewItem::takeItem(..)Code: Alles auswählen
QListViewItem::insertItem(..)Der Zeitverlust gegenüber dem take und insert ist (je nach Anzahl der Items) zu vernachlässigen.
Gruss Arne
Genau, allerdings kann ich den Baum nicht einfach löschen und neu einlesen, da die Daten in einem Strom daherkommen und nicht gepuffert werden. Hier ein Beispiel wie ich es gerade probiert habe:
Die Top-Level Einträge Online und Offline gibt es, sie werden auch nciht gelöscht.
Das Problem jetzt ist nur, dass das ganze nur einmal funktioniert, allerdings mit folgender Fehlermeldung:
Beim zweiten Mal stürzt das ganze Programm mit einem Segfault ab.
edit: Ich habe gerade festgestellt, dass removeItem obsolet ist, mit takeItem gehts allerdings genausowenig
Mfg,
Alex
Code: Alles auswählen
listView1->removeItem( listView1->findItem( strUsername, 0 ) );
QListViewItem *onlineTree = listView1->findItem( "Online", 0 );
QListViewItem *offlineTree = listView1->findItem( "Offline", 0 );
if( iStatus == OnlineStatus::Online ) {
QListViewItem *reparented = new QListViewItem( onlineTree );
reparented->setPixmap( 0, QPixmap( qApp->applicationDirPath() + "/data/online.png" ) );
reparented->setText( 0, strUsername );
}
else if( iStatus == OnlineStatus::Offline ) {
QListViewItem *reparented = new QListViewItem( offlineTree );
reparented->setPixmap( 0, QPixmap( qApp->applicationDirPath() + "/data/offline.png" ) );
reparented->setText( 0, strUsername );
}
Das Problem jetzt ist nur, dass das ganze nur einmal funktioniert, allerdings mit folgender Fehlermeldung:
Code: Alles auswählen
Warning: QGArray::at: Absolute index 64 out of range
Warning: QGArray::at: Absolute index 72 out of range
Warning: QGArray::at: Absolute index 64 out of range
Warning: QGArray::at: Absolute index 72 out of range
Warning: QGArray::at: Absolute index 72 out of range
Warning: QGArray::at: Absolute index 64 out of range
Warning: QGArray::at: Absolute index 64 out of range
edit: Ich habe gerade festgestellt, dass removeItem obsolet ist, mit takeItem gehts allerdings genausowenig
Mfg,
Alex
-
FlorianBecker
- Beiträge: 1213
- Registriert: 2. Dezember 2004 10:54
- Kontaktdaten:
Bei den GArray Fehlern handelt es sich um falsch übergebene Werte, die nicht vorhanden sind. Wenn Abfragen solcher Werte groß genug werden z.B. 1000 Stück, dann gibts bereits beim ersten ausführen ein Seg.Fault.
Ich will nicht zuviel versprechen, aber es handelt sich hierbei "nur" um falsche Werte, die übergeben werden. Eben nicht vorhandene Werte.
Ich würde die ganzen übergaben prüfen und erstmal die GArray Fehler wegmachen.
Ich will nicht zuviel versprechen, aber es handelt sich hierbei "nur" um falsche Werte, die übergeben werden. Eben nicht vorhandene Werte.
Ich würde die ganzen übergaben prüfen und erstmal die GArray Fehler wegmachen.
-
FlorianBecker
- Beiträge: 1213
- Registriert: 2. Dezember 2004 10:54
- Kontaktdaten:
Du fragst zweimal die gleichen Werte ab. Sonst definitv nein. Qt 3.3.x ist so gut, das es kaum mehr wirkliche Fehler gibt, die bei Qt liegen und selbst davon kann die meisten umgehen.
Die GArray Fehler sind Zugriffe auf Werte die nicht vorhanden sind, weil Sie außerhalb des Bereiches sind. Mehr kann ich dazu nicht sagen, das Problem kann irgendwo vorher in deinem Code auftreten, denn der gepostete Code sieht "gut" aus.
Wobei du wirklich glück hast, dass es nur so wenige Fehler sind. Bei Abrehnungen von 20.000 SQL Zeilen, die verrechnet oder verschoben werden kamen auch teilweise mal 5.000 GArray Fehler bei raus.
Die Feststellung war, das es immer Felder sind, die unsauber verschoben wurden oder die gar nicht existiert hatten.
Wir haben die ganze Klasse dann erneut geschrieben, da eine Rekonstruierung des Fehlers viel länger gedauert hätte.
Die GArray Fehler sind Zugriffe auf Werte die nicht vorhanden sind, weil Sie außerhalb des Bereiches sind. Mehr kann ich dazu nicht sagen, das Problem kann irgendwo vorher in deinem Code auftreten, denn der gepostete Code sieht "gut" aus.
Wobei du wirklich glück hast, dass es nur so wenige Fehler sind. Bei Abrehnungen von 20.000 SQL Zeilen, die verrechnet oder verschoben werden kamen auch teilweise mal 5.000 GArray Fehler bei raus.
Die Feststellung war, das es immer Felder sind, die unsauber verschoben wurden oder die gar nicht existiert hatten.
Wir haben die ganze Klasse dann erneut geschrieben, da eine Rekonstruierung des Fehlers viel länger gedauert hätte.
Ich glaub ich habs schon, ich hab jetzt mal nach den findItem()'s Q_CHECK_PTR's reingeworfen und habe folgendes erhalten:
(line 112 ist die Zeile: QListViewItem *onlineTree = listView1->findItem( "Online", 0 );)
Aber, out of memory? Ich denke nicht, dass ich so wenig Hauptspeicher habe ...
ad SQL Fehler, stimmt, hatte ich auch schonmal, allerdings in der Serveranwendung, hier geht es aber um eine Anwendung in der es keine Datenbank gibt.
Code: Alles auswählen
Warning: In file mainwindowclass.cpp, line 112: Out of memory
Segmentation fault
Aber, out of memory? Ich denke nicht, dass ich so wenig Hauptspeicher habe ...
ad SQL Fehler, stimmt, hatte ich auch schonmal, allerdings in der Serveranwendung, hier geht es aber um eine Anwendung in der es keine Datenbank gibt.
-
FlorianBecker
- Beiträge: 1213
- Registriert: 2. Dezember 2004 10:54
- Kontaktdaten: