Seite 1 von 1

[relativ gut gelöst] QItemSelectionModel::select zu langsam?

Verfasst: 8. April 2011 15:23
von forgoden
Also wenn ich 400 QStandardItems habe und die alle mit

QItemSelectionModel::select

auswählen will, dauert es 4 Sekunden in der release-version
wenn ich in TreeView aber Strg+A mache, markiert er sofort alle items.

Genau diesen Befehl in der for-Schleife macht es so langsam:

Code: Alles auswählen

selectionModel->select(model->index(i,0), QItemSelectionModel::Select);
Ist es bekannt dass dieser Befehl lahm ist? Oder hab ich irgendwas falsch gemacht?


Der Befehl selectAll aus TreeView oder range helfen nicht, weil eben nicht alle ausgewählt werden sollen

Verfasst: 8. April 2011 18:03
von upsala
Wie wäre es, die 2. select-Methode zu verwenden?

Verfasst: 9. April 2011 00:24
von forgoden
Okay, ich dachte da kann man nur ranges nehmen

Code: Alles auswählen

QItemSelection selection;
// for schleife
QModelIndex topLeft;
topLeft = model->index(i, 0, QModelIndex());
selection.select(topLeft, topLeft);
// schleife zu ende
selectionModel->select(selection, QItemSelectionModel::Select);
das geht wohl tatsächlich schneller. danke

Verfasst: 9. April 2011 08:24
von upsala
Du hast doch einen Range, du hast ja auch eine Schleife.

Verfasst: 9. April 2011 15:50
von forgoden
In der Schleife befindet sich nochmal eine Abfrage, indem nur die Objekte reinfallen, die sich im Auswahlbereich der 2D-Ansicht befinden.

Code: Alles auswählen

			view->clearSelection();
			QItemSelection selection;
			for (int i=0; model->item(i,0) != 0; ++i) {
				obj_p = reinterpret_cast<Object*>( model->item(i,0)->data(ObjectRole).toInt() );

				if ( ( holdpos.x() > obj_p->x()+centralpos.x() && obj_p->x()+centralpos.x() > event->pos().x()
					  ||  holdpos.x() < obj_p->x()+centralpos.x() && obj_p->x()+centralpos.x() < event->pos().x() )
					  && ( holdpos.y() > obj_p->y()+centralpos.y() && obj_p->y()+centralpos.y() > event->pos().y()
					  ||  holdpos.y() < obj_p->y()+centralpos.y() && obj_p->y()+centralpos.y() < event->pos().y() )
					) { 
						QModelIndex topLeft;
						topLeft = model->index(i, 0, QModelIndex());
						selection.select(topLeft, topLeft);
				}
			}
			selectionModel->select(selection, QItemSelectionModel::Select);

Verfasst: 9. April 2011 20:02
von upsala
Den reinterpret_cast kommentier ich jetzt mal nicht...

Verfasst: 10. April 2011 16:05
von forgoden
data nimmt keine fremden Objekte als Zeiger an...

Verfasst: 10. April 2011 21:11
von upsala
QVariant kann jeden Datentyp annehmen und einen reinterpret_cast braucht man eigentlich nie

Verfasst: 11. April 2011 01:47
von forgoden
wenn man mit

Q_DECLARE_METATYPE(Object)
für QVariant bekannt macht ja, aber nicht das

Q_DECLARE_METATYPE(Object *)