PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Frage zu QTable und QTableItem



Kirsche
19-10-2005, 22:43
Hallo Leute,

ich habe QTableItem abgeleitet, um die Hintergrundfarbe unterschiedlich wählen zu können. Meine Klasse heißt TableItem. Diese Items füge in nun in eine Tabelle ein.

TableItem* item;

for( int i = 0; i < string.length(); i++ )
{
item = new TableItem( table, QTableItem::WhenCurrent, (QString)referenceSequence[i], (QString)referenceSequence[i] );
item->setRow( 0 );
table->setItem( 0, i, item );
}

Da ich die Items mit "new" erstellt habe, muss ich sie löschen, es sei denn, die Tabelle wird gelöscht, denn dann werden sie auch gelöscht. Bisher richtig?

Nun das Problem: Der Inhalt der Tabelle wird dynamisch verändert, je nachdem was der Benutzer auswählt. Die Tabelle wird also nicht gelöscht, aber die Items werden ungültig. Ich setze die Anzahl der Reihen zurück auf 0:
"table->setNumRows( 0 )"

Anschließend füge ich die neuen Zeilen ein, aber alles in derselben Tabelle.
"sequenceTable->setNumRows( sequenceTable->numRows() + 1 )"

Erzeuge ich so Pointer ins Nirvana, oder werden meine Items gelöscht, wenn ich die Zeilenanzahl auf 0 setze? Wenn nicht, wann und wie lösche ich sie dann? Sie haben ja keinen Namen, sondern stecken in der Tabelle. :confused:

Vielen Dank,

anda_skoa
19-10-2005, 23:10
Hmm, gute Frage.

Nachdem in der Doku nicht steht, daß sie gelöscht werden, würde ich eher davon ausgehen, daß sie nachwievor gültig sind.

Könnte man leicht mit einem Debugoutput im TableIItem Desktrutor rausfinden :)

Mit clearCell könnte man sie sicher löschen.

Allerdings könnte man sie auch updaten, wie stark ändern sich denn die Daten?

Ciao,
_

Uwe
20-10-2005, 07:57
Einfach paintCell überladen, dort die QColorGroup manipulieren und anschliessen paintCell der Basisklasse rufen. Das geht einfacher und Du mußt Dir keine Gedanken über die Lebenszeit der QTableItems machen.

Falls Du verstehen willst, wann Table Items gelöscht werden, setze einen Breakpoint im Destruktor Deiner Items mit dem Debugger und Du hast die Antwort in wenigen Sekunden.

HTH,
Uwe

Kirsche
20-10-2005, 09:17
Hallo anda_skoa, hallo Uwe,

danke für die Idee mit dem Output im Destruktor. Ich habe einfach eine QMessageBox in den Destruktor gesetzt. Die Items werden tatsächlich gelöscht, wenn man eine Zeile entfernt. Ist ja eigentlich auch sinnvoll. Schließlich wird die Zeile gelöscht, also sollte es auch der Inhalt.

Nun bin ich beruhigt. Ich dachte schon, ich produziere ein riesiges Speicherleck.

Die Daten ändern sich sehr stark. Außerdem kann die Tabelle mal 10 Einträge und mal 1000 enthalten. Darum ändere ich den Inhalt der Tabelle jedesmal. Ich habe auch schon überlegt, alles in die Tabelle (also hintereinander weg ) einzutragen. Dann hätte ich vermutlich 10000 oder mehr Spalten. Ich würde dann mit hide und show immer einblenden, was ich gerade brauche. Aber ich denke, so große Tabellen sind nicht zu empfehlen, oder? Es erscheint mir sinnvoller, immer das in die Tabelle einzutragen, was ich gerade brauche.

Bei paintCell weiß ich gar nicht, was da normalerweise drinsteht. Was muss denn da alles rein, abgesehen von meinen Farbmodifikationen? Wenn ich normale QTableItems verwende, müssen diese doch auch gelöscht werden. Oder soll ich gar keine QTableItems benutzen? Geht das Ganze dann schneller?

Schöne Grüße,

anda_skoa
20-10-2005, 10:15
Die Items werden tatsächlich gelöscht, wenn man eine Zeile entfernt.

Gut zu wissen.



Bei paintCell weiß ich gar nicht, was da normalerweise drinsteht. Was muss denn da alles rein, abgesehen von meinen Farbmodifikationen?

Die Idee hinter Uwes Vorschlag ist, daß du das nicht wissen mußt, weil du ja nur die Farben modifizierst, das Zeichnen selbst aber der vorhandenen Basisimplementation überläßt.

Ciao,
_

Kirsche
20-10-2005, 10:57
Hallo anda_skoa,

und wie genau macht man das? Ich kenne mich mit Vererbung nicht so gut aus. Ich weiß, dass ich QTable ableiten kann.Ich erstelle also eine neue Klasse, z.B. Table. Dort erstelle eine Funktion "paintCell". Darin änder ich die Farben. Ich möchte die Farben pro Zelle ändern.

Wie rufe ich dann die Funktion der Basisklasse auf?

Schöne Grüße,
Kirstin

anda_skoa
20-10-2005, 20:22
Aufruf der Basisimplementierung ist einfach



Basisklasse::methodenName(parameter);


Ciao,
_

Kirsche
21-10-2005, 08:36
Hallo anda_skoa,

danke für die Erklärung.

Schöne Grüße,