[gelöst]QTableWidget gibt QTableWidget nicht frei

Alles rund um die Programmierung mit Qt
Antworten
jerry42
Beiträge: 126
Registriert: 9. Oktober 2008 10:48

[gelöst]QTableWidget gibt QTableWidget nicht frei

Beitrag von jerry42 »

Hallo zusammen,
ein neuer Tag bringt ein neues Problem :)

Ich arbeite gerade mit dem QTableWidet.

Ich lege bei der Initialisierung meiner Widgetklasse ein neues QTableWidget an, und generiere zu Testzwecken in ein QVector<QTableWidgetItem*> eine Menge an Items.

Wenn ich nun aufgrund von Größenveränderungen des Widgets die Positionen der Items neu berechne und neu einfügen will bekomme ich folgende Fehlermeldung:
"QTableWidget: cannot insert an item that is already owned by another QTableWidget"

Ich gehe folgendermaßen vor:

Im Konstruktor meines Widgets lege ich den Datenvector an und initialisiere das QTableWIdget, und rufe dann die Methode auf die das ganze Befüllen soll. Die Parameter dienen nur der Berechnung der notwendigen Anzahl an Spalten und Zeilen:

Code: Alles auswählen

for (int d = 0; d < bilder_insgesamt; d++) {
	items.push_back(new QTableWidgetItem(QIcon(QPixmap("test.jpg")), ""));
	items[0]->setToolTip("Name der Datei");
}

qtw = new QTableWidget(this);
recalculateAndRearrangeTable(view, QSize(100, 100));
In der recalculateAndRearrangeTable()-Methode versuche ich zunächst alle Items herauszulöschen. Danach berechne ich die notwendige Anzahl an Spalten und Reihen neu und versuche die selben Items aus dem QVector wieder einzufügen.

Code: Alles auswählen

int rows = qtw->rowCount();
int columns = qtw->columnCount();

for(int reihe = 0; reihe < rows; reihe++) {
	for (int spalte = 0; spalte < columns; spalte++) {
		delete qtw->itemAt(spalte, reihe);
	}
}
...
qtw->setColumnCount(anzahlMoeglicherBilderProZeile);
qtw->setRowCount(reihen);
...
qtw->setItem(j, k, items[bilderEingefuegt]);
Beim ersten Durchlauf funktioniert das Ganze problemlos, sobald ich aber zum zweiten Mal sortieren will bekomme ich obige Fehlermeldung.
Setze ich bei jedem Neuberechnen mit new neu erzeugte Items hinein klappt es. Aber das ist natürlich nicht der Sinn.
Ich weiß nicht wie ich die Items "frei" bekomme.

Ob ich übrigens in der recalculateAndRearrangeTable-Methode ein neues QTableWidget erzeuge mit new, ändert an der Fehlermeldung leider gar nichts. Irgendwie/wo bleibt die Verbindung zum alten Widget bestehen.
Auch wenn ich

Code: Alles auswählen

delete qtw;
qtw = new QTableWidget(this),
aufrufe, ändert dies nichts.

Ich hoffe, mir kann jemand helfen.
Vielen Dank.

Viele Grüße
jerry42
Zuletzt geändert von jerry42 am 24. Oktober 2008 15:07, insgesamt 1-mal geändert.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Qt Doku hat geschrieben: void QTableWidget::setItem ( int row, int column, QTableWidgetItem * item )

Sets the item for the given row and column to item.

The table takes ownership of the item.
Also darfst Du die Items nicht selbst löschen!
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
jerry42
Beiträge: 126
Registriert: 9. Oktober 2008 10:48

Beitrag von jerry42 »

Zunächst vielen Dank für den schnellen Hinweis.

hm...letztlich will ich sie auch nicht löschen. Ich will nur dass das QTableWidget die wieder hergibt :)
Aber mit removeCellWidget() kommt eben auch derselbe Fehler.
jerry42
Beiträge: 126
Registriert: 9. Oktober 2008 10:48

Beitrag von jerry42 »

Hab die Lösung gefunden.

mit removeCellWidget, removeRoW, removeColumn war ich auf dem falschen Dampfer.

WIe heißt es so schön, vor lauter Bäumen den Wald nicht sehen?!

QTableWidget::takeItem() ist hier die Lösung des Problems.

Viele Grüße jerry42
surfman19
Beiträge: 52
Registriert: 22. August 2008 18:20

Beitrag von surfman19 »

wie setzt man den namen einer spalte bzw. einer zeile des QTableWidget?
jerry42
Beiträge: 126
Registriert: 9. Oktober 2008 10:48

Beitrag von jerry42 »

das ganze ist ungetestet, aber ich könnte mir vorstellen, dass folgende Methode in QTableWidget dir weiterhilft.

QTableWidgetItem * QTableWidget::horizontalHeaderItem ( int column ) const


Und bei QTableWidgetItem kannst du ja setText() aufrufen.

Gruß jerry42
surfman19
Beiträge: 52
Registriert: 22. August 2008 18:20

Beitrag von surfman19 »

tableWidget != QTableWidgetItem

ein tableWidget besteht aus mehreren QTableWidgetItems!

QTableWidgetItems ist ja der inhalt einer reihe/spalte...
jerry42
Beiträge: 126
Registriert: 9. Oktober 2008 10:48

Beitrag von jerry42 »

Ok, funktioniert so nicht. Ich dachte, dass intern vlt. auch ein QTableWidgetItem genutzt wird um den Header zu machen.

Hiermit funktioniert es aber. :)
void QTableWidget::setHorizontalHeaderLabels ( const QStringList & labels )
chrootdev
Beiträge: 70
Registriert: 18. April 2008 17:52

Beitrag von chrootdev »

Am besten mit:

Code: Alles auswählen

QStringList header_list;

header_list<<"header1"<<"header2"<<"header3";

[...]setHorizontalHeaderLabels(header_list)
Antworten