Seite 1 von 1

[gelöst]QTableWidget gibt QTableWidget nicht frei

Verfasst: 24. Oktober 2008 14:07
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

Verfasst: 24. Oktober 2008 14:35
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!

Verfasst: 24. Oktober 2008 14:39
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.

Verfasst: 24. Oktober 2008 15:10
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

Verfasst: 28. Oktober 2008 15:07
von surfman19
wie setzt man den namen einer spalte bzw. einer zeile des QTableWidget?

Verfasst: 28. Oktober 2008 15:12
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

Verfasst: 28. Oktober 2008 15:20
von surfman19
tableWidget != QTableWidgetItem

ein tableWidget besteht aus mehreren QTableWidgetItems!

QTableWidgetItems ist ja der inhalt einer reihe/spalte...

Verfasst: 28. Oktober 2008 15:28
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 )

Verfasst: 28. Oktober 2008 16:40
von chrootdev
Am besten mit:

Code: Alles auswählen

QStringList header_list;

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

[...]setHorizontalHeaderLabels(header_list)