Seite 1 von 1

QTableItem langsam?

Verfasst: 15. Juli 2010 01:10
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.

Verfasst: 15. Juli 2010 08:48
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..

Verfasst: 15. Juli 2010 13:06
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