Seite 1 von 1
[gelöst] Elemente einer QListView reparenten
Verfasst: 20. Juni 2005 21:20
von Nassian
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
Verfasst: 20. Juni 2005 22:06
von FlorianBecker
Bei dem Item muss das parent, das item darüber sein, wo ist das Problem?
QListViewItem *item = new QListViewItem( lstView );
item = new QListViewItem( item );
item = new QListViewItem( item );
item = new QListViewItem( item );
ergibt:
-
--
---
----
Verfasst: 20. Juni 2005 22:15
von ArneStocker
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
Verfasst: 20. Juni 2005 22:27
von Nassian
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:
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 );
}
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:
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
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
Verfasst: 21. Juni 2005 14:26
von FlorianBecker
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.
Verfasst: 21. Juni 2005 15:03
von Nassian
Die QGArray Fehler kommen ja durch den Code den ich gepostet habe, deshalb hab ich auch keine Ahnung.
Was ich allerdings komisch finde, ist wenn ich mit einem QListViewIterator durchiteriere, kommen einige Felder doppelt vor, ist das normal?
Verfasst: 21. Juni 2005 15:10
von FlorianBecker
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.
Verfasst: 21. Juni 2005 15:17
von Nassian
Ich glaub ich habs schon, ich hab jetzt mal nach den findItem()'s Q_CHECK_PTR's reingeworfen und habe folgendes erhalten:
Code: Alles auswählen
Warning: In file mainwindowclass.cpp, line 112: Out of memory
Segmentation fault
(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.
Verfasst: 21. Juni 2005 15:23
von FlorianBecker
Out of Memory heißt Kein allokierter Speicher mehr.
Verfasst: 21. Juni 2005 15:27
von Nassian
Danke, hab ich eben herausgefunden als ich mir mal alle einträge ausgeben hab lassen. Komischerweise fehlt "Online".
Ich werde das Problem wohl komplett umgehen müssen, trotzdem vielen Dank für eure Hilfe!