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 *)