[solved] QTableWidget => items werden nicht hinzugefügt

Alles rund um die Programmierung mit Qt
Antworten
Dawn
Beiträge: 11
Registriert: 5. Dezember 2006 08:20
Wohnort: Hagen
Kontaktdaten:

[solved] QTableWidget => items werden nicht hinzugefügt

Beitrag von Dawn »

Hallo zusammen!
Ich hänge seit einiger Zeit an einem Problem fest.
Ich habe ein QTableWidget in das ich neue Zeilen einfüge.
Dabei handelt es sich um jeweils 4 Spalten, von der einer mit einer QProgressBar belegt wird. Soweit so gut.
Wenn ich zwei Zeilen einfüge funktioniert alles wunderbar, aber nach der 3. Zeile wird nurnoch die erste Spalte in der neuen Zeilen eingefügt und die restlichen 3 Spalten bleiben leer.

Dieser Code ist für das einfügen der Zeile verantwortlich

Code: Alles auswählen

void MainWidget::addItem(Todo* todo)
{
	if(!todo)
		return;

	int row = Table->rowCount();
	Table->insertRow(row);

	QProgressBar* bar = new QProgressBar();
	bar->setRange(0,100);
	bar->setValue(todo->Progress);

	QString stat;
	switch(todo->Status)
	{
	case 1:
		stat = "In progress";
		break;

	case 2:
		stat = "Finished";
		break;

	default:
		stat = "Not started";
		break;
	}

	QTableWidgetItem* it = new QTableWidgetItem(QString("  ")+todo->Name);
	it->setData(Qt::UserRole+1,todo->id);
	Table->setItem(row,0,it);

	it = new QTableWidgetItem(QString("  ")+stat);
	it->setData(Qt::UserRole+1,todo->id);
	Table->setItem(row,2,it);

	it = new QTableWidgetItem(QString("  %1").arg(todo->Priority));
	it->setData(Qt::UserRole+1,todo->id);
	Table->setItem(row,3,it);

	it = new QTableWidgetItem(QString("  ")+todo->Cat->Name);
	it->setData(Qt::UserRole+1,todo->id);
	Table->setItem(row,4,it);

	Table->setCellWidget(row,1,bar);
	bar->setProperty("todoid",todo->id);

	Table->setRowHeight(row,Table->rowHeight(row)*0.6);
}
Table ist definiert als QTableWidget* Table;

Das Problem tritt auf meinem Windows XP Rechner mit Qt 4.2.2 und auf meinem kubuntu Rechner mit Qt 4.2.3 auf
Zuletzt geändert von Dawn am 30. September 2007 01:01, insgesamt 1-mal geändert.
If you smile and no one else is around, you really mean it
Zandru
Beiträge: 84
Registriert: 29. Mai 2007 15:35

Beitrag von Zandru »

keine Ahnung, aber was mich stutzig gemacht hat: warum fügst du Sachen in die Spalten 0,2,3,4 ein?
Dawn
Beiträge: 11
Registriert: 5. Dezember 2006 08:20
Wohnort: Hagen
Kontaktdaten:

Beitrag von Dawn »

weil ich in die spalte 1 ein QProgressBar einfüge, dass ich nicht über setItem sondern über setCellWidget einfügen muss.
Wird ganz am ende der funktion gemacht.

Das ist echt zum verzweifeln.
If you smile and no one else is around, you really mean it
lepsai
Beiträge: 573
Registriert: 14. September 2004 21:33
Wohnort: Berlin
Kontaktdaten:

Beitrag von lepsai »

ist setColumnCount() aufgerufen?
Dawn
Beiträge: 11
Registriert: 5. Dezember 2006 08:20
Wohnort: Hagen
Kontaktdaten:

Beitrag von Dawn »

Jup... denn in den ersten beiden Zeilen wird ja alles richtig eingetragen
If you smile and no one else is around, you really mean it
lepsai
Beiträge: 573
Registriert: 14. September 2004 21:33
Wohnort: Berlin
Kontaktdaten:

Beitrag von lepsai »

dann bitte den kompletten Code posten...
Dawn
Beiträge: 11
Registriert: 5. Dezember 2006 08:20
Wohnort: Hagen
Kontaktdaten:

Beitrag von Dawn »

Ist aber schon ein wenig größer und auch nicht gerade schön und nicht kommentiert...
Dateianhänge
TodoManager.zip
Der komplette Quellcode
(54.28 KiB) 238-mal heruntergeladen
If you smile and no one else is around, you really mean it
Dawn
Beiträge: 11
Registriert: 5. Dezember 2006 08:20
Wohnort: Hagen
Kontaktdaten:

Beitrag von Dawn »

Für alle die es interessiert:
Ich hab den "Fehler" gefunden.

Man muss die Sortierung verrübergehend deaktivieren, damit die Items nicht in eine andere Reihe sortiert werden.
If you smile and no one else is around, you really mean it
mf2
Beiträge: 4
Registriert: 3. Januar 2006 00:17

Beitrag von mf2 »

Ich wei
ß, das hier ist ein alter Post, aber ich hatte das gleiche Problem und bin über Google hierhergekommen.

Die Sortierung vorübergehend zu deaktivieren war für mich keine Option, da dies ziemlich an der Performance nagt. Ich habe es wie folgt gelöst:

Code: Alles auswählen

a = new QTableWidgetItem(0);
a->setText("bla");
b = new QTableWidgetItem(0);

int row = 23;
table->setItem( row, 0, a );
row = a->row();
table->setItem( row, 1, b );
Ums zu beschreiben: Nachdem das erste Item in eine Reihe eingefügt wurde, überprüfe ich mittels QTableWidgetItem::row(), ob die Reihe "verrutscht" ist und nutze ggf. den neuen Wert.
Falls noch jemand dieses Problem hat, hoffe ich, dass dies hilfreich ist.
Antworten