[gelöst] Elemente einer QListView reparenten

Alles rund um die Programmierung mit Qt
Antworten
Nassian
Beiträge: 126
Registriert: 20. Juni 2005 21:14

[gelöst] Elemente einer QListView reparenten

Beitrag 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
FlorianBecker
Beiträge: 1213
Registriert: 2. Dezember 2004 10:54
Kontaktdaten:

Beitrag 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:
-
--
---
----
ArneStocker
Beiträge: 300
Registriert: 3. November 2004 16:15
Wohnort: Berlin

Beitrag von ArneStocker »

Hallo

wenn ich Dich richtig verstanden habe, willst Du ein bestehendes Item 'umsortieren' ohne es zu löschen

Code: Alles auswählen

QListViewItem::takeItem(..)
und

Code: Alles auswählen

QListViewItem::insertItem(..)
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
Nassian
Beiträge: 126
Registriert: 20. Juni 2005 21:14

Beitrag 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
FlorianBecker
Beiträge: 1213
Registriert: 2. Dezember 2004 10:54
Kontaktdaten:

Beitrag 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.
Nassian
Beiträge: 126
Registriert: 20. Juni 2005 21:14

Beitrag 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?
FlorianBecker
Beiträge: 1213
Registriert: 2. Dezember 2004 10:54
Kontaktdaten:

Beitrag 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.
Nassian
Beiträge: 126
Registriert: 20. Juni 2005 21:14

Beitrag 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.
FlorianBecker
Beiträge: 1213
Registriert: 2. Dezember 2004 10:54
Kontaktdaten:

Beitrag von FlorianBecker »

Out of Memory heißt Kein allokierter Speicher mehr.
Nassian
Beiträge: 126
Registriert: 20. Juni 2005 21:14

Beitrag 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!
Antworten