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

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

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

Beitrag 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
Zuletzt geändert von forgoden am 9. April 2011 00:28, insgesamt 1-mal geändert.
Win7, VisualStudio 2010, Qt 4.7
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Wie wäre es, die 2. select-Methode zu verwenden?
forgoden
Beiträge: 120
Registriert: 10. Februar 2008 17:52

Beitrag 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
Win7, VisualStudio 2010, Qt 4.7
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Du hast doch einen Range, du hast ja auch eine Schleife.
forgoden
Beiträge: 120
Registriert: 10. Februar 2008 17:52

Beitrag 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);
Win7, VisualStudio 2010, Qt 4.7
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Den reinterpret_cast kommentier ich jetzt mal nicht...
forgoden
Beiträge: 120
Registriert: 10. Februar 2008 17:52

Beitrag von forgoden »

data nimmt keine fremden Objekte als Zeiger an...
Win7, VisualStudio 2010, Qt 4.7
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

QVariant kann jeden Datentyp annehmen und einen reinterpret_cast braucht man eigentlich nie
forgoden
Beiträge: 120
Registriert: 10. Februar 2008 17:52

Beitrag von forgoden »

wenn man mit

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

Q_DECLARE_METATYPE(Object *)
Win7, VisualStudio 2010, Qt 4.7
Antworten