QTableItem langsam?

Alles rund um die Programmierung mit Qt
Antworten
forgoden
Beiträge: 120
Registriert: 10. Februar 2008 17:52

QTableItem langsam?

Beitrag von forgoden »

Hallo, wenn ich ganz viele rows erzeuge, etwa 1000 dann dauert es sehr lange.
Ist das normal?

Im Moment sieht der Code so aus:

Code: Alles auswählen

if (updateTableBool) {
		while(table->rowCount()) {	
			table->removeRow(table->rowCount()-1);
		}
		for ( unsigned int i=0; i < (*vector).size(); ++i ) { 
		table->insertRow(table->rowCount());
			if ((*vector)[i]->parent())
				cell1 = new QTableWidgetItem(tr("%1").arg((*vector)[i]->parent()->id()+1)); 
			else
				cell1 = new QTableWidgetItem(tr("0"));
			cell2 = new QTableWidgetItem(tr("%1,%2,%3").arg((*vector)[i]->x()).arg((*vector)[i]->y()).arg((*vector)[i]->direction()));
			if ((*vector)[i]->childLeft() && (*vector)[i]->childRight()) {
				cell3 = new QTableWidgetItem(tr("%1").arg((*vector)[i]->childLeft()->id()+1)); 
				cell4 = new QTableWidgetItem(tr("%1").arg((*vector)[i]->childRight()->id()+1)); 
			}
			else {
				cell3 = new QTableWidgetItem(tr("keine"));
				cell4 = new QTableWidgetItem(tr("keine"));
			}
			table->setItem(i,0,cell1 );
			table->setItem(i,1,cell2 );
			table->setItem(i,2,cell3 );
			table->setItem(i,3,cell4 );
		}
	}
Ist der Code schlecht, oder geht das nicht anders? Es müssen nämlich über mehr als 10000 rows sein.
Win7, VisualStudio 2010, Qt 4.7
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

Wichtig beim Optimieren für viele Daten ist, dass die View möglichst nur eine einzige Änderung behandelt (also nicht 20'000x eine Änderung der Anzahl Zeilen sondern nur 1x).

Du hast daher folgende Varianten:
1. Versuche , anstelle "insertRow(..)" mit setRowCount() gleich die richtige Anzahl Zeilen zu setzen (keine Ahnung ob das klappt, ich arbeite stets mit Model/View, siehe 3.).

2. Falls 1. nicht klappt, kannst du das ganz sicher über das Model erledigen (table->model()->removeRows(..) und table->model()->insertRows()..

3. Falls du weiter optimieren möchtest: nimm kein QTableWidget sondern ein QTableView + einem eigenen Model (sobald mehr Daten als ein "HelloWorld" in einer Tabelle verlangt wird, ist das die richtige Lösung)

hth..
forgoden
Beiträge: 120
Registriert: 10. Februar 2008 17:52

Beitrag von forgoden »

Ich habe auch vermutet dass man view/model nehmen soll. Es stand leider nicht direkt dass es auch schneller ist.

Verstehe ich das so richtig: Mit Model/View kann man nur noch ein Teil der großen Datenbank anzeigen lassen und die anderen Daten werden erst dann angezeigt, sobald man dahinscrollt?

Was mir nicht so klar ist: Woher will View wissen wo groß die Daten sind? Der Scrollbalken muss ja die richtige Größe haben?

aus der doku /qt4/doc/html/qabstractitemview.html bin ich auf der richtigen Spur?

Code: Alles auswählen

void MyView::resizeEvent(QResizeEvent *event) {
     horizontalScrollBar()->setRange(0, realWidth - width());
     ...
 }
Die Daten werden in standard-c++ Containern gespeichert. Damit muss man kommunizieren. Geht schon oder?

Gibt es vielleicht Beispiele wie diese QT, C++ Bauteile zusammengesetzt ist? In QT Demos find ich nur einfache Beispiele
Win7, VisualStudio 2010, Qt 4.7
Antworten