Seite 1 von 1

QItemSelectionModel::selectedRows sortiert oder unsortiert?

Verfasst: 6. Januar 2009 22:25
von sigvdr
Laut Beschreibung von :
QModelIndexList QItemSelectionModel::selectedRows(int column)
Returns the indexes in the given column for the rows where all columns are selected.
erhalte ich eine Liste mit allen Zellen einer Tabellenspalte falls die komplette Reihe selektiert ist.
Wenn also in meiner Tabelle ( QTableListView ) die kompletten Zeilen 4,5 und 6 selektiert sind erhalte ich für eine Spalte z.B. selectedRows(3) die Zellen:
Zelle(Spalte3,Reihe4) , Zelle(Spalte3,Reihe5) , Zelle(Spalte3,Reihe6)
und für eine Spalte z.B. selectedRows(5) die Zellen:
Zelle(Spalte5,Reihe4) , Zelle(Spalte5,Reihe5) , Zelle(Spalte5,Reihe6)

So hat das bisher ( mit QT4.3.4 ) auch problemlos funktioniert.

Nach Umstellung auf QT 4.4.3 ist aber die Reihenfolge der Reihen nicht mehr gleich.
jetzt kommt ( mehr oder weniger zufällig ) z.B.
für eine Spalte z.B. selectedRows(3) die Zellen:
Zelle(Spalte3,Reihe5) , Zelle(Spalte3,Reihe4) , Zelle(Spalte3,Reihe6)
und für eine Spalte z.B. selectedRows(5) die Zellen:
Zelle(Spalte5,Reihe6) , Zelle(Spalte5,Reihe5) , Zelle(Spalte5,Reihe4)

Darf ich jetzt erwarten, dass die Reihenfolge der Reihen für jede Spalte gleich ist ( wie bei QT4.3.4 ) und ist demnach QT4.4.3 fehlerhaft ?
Kann dieses Verhalten jemand bestätigen ?
Gibt es eine bessere ( sicherere ) Methode um an die selektierten Zeilen zu kommen ?

Für die Tests benutze ich:
Alt: QT4.3.4 auf Ubuntu 8.04
Neu: QT4.4.3 auf Ubuntu 8.10

Und noch ein Hinweis:
Wenn ich das Programm mit QT4.4.3 erstelle und dann auf dem Rechner mit QT4.3.4 laufen lasse, stimmt die Reihenfolge wieder.

Zum Schluss noch das Stück Code das mir diese Probleme bereitet.

Code: Alles auswählen

QString QDragTableView::selectedRows(QList<int> columns){
	QList<QModelIndexList> cols;
	int colCount = columns.count();
	for ( int c = 0 ; c < colCount ; c++) {
		cols.append(selectionModel()->selectedRows(columns[c]));
	}
	QString lineSeparator= "";
	QString zelle = ""; 
	QString text = ""; 
	for ( int i = 0; i < cols[0].count(); i++) {
		for ( int c = 0 ; c < colCount ; c++) {
			zelle = "("+QString::number(cols[c][i].row())+":"+QString::number(cols[c][i].column())+")";
			text += zelle;
		}
		lineSeparator = "\n";
	}
	return text;
}
Gruß Sig

Verfasst: 7. Januar 2009 07:11
von upsala
Es ist in der Doku nirgends erwähnt, daß es sortiert sein sollte.

Verfasst: 7. Januar 2009 08:35
von sigvdr
Es ist in der Doku nirgends erwähnt, daß es sortiert sein sollte.
Das stimmt schon, aber sollte ( solange sich an der Selektion nichts ändert ) nicht immer zumindest die selbe Reihenfolge eingehalten werden ?

Gruß Sig

Verfasst: 7. Januar 2009 09:02
von solarix
Die Trolls geben explizit an, wenn Listen sortiert oder nicht sortiert zurueck gegeben werden. Beispiel:

http://doc.trolltech.com/4.4/qmap.html#keys ("in ascending order")
http://doc.trolltech.com/4.0/qabstracti ... tedIndexes ("is not sorted")

Bei allen Qt-Methoden ohne Angaben wuerde ich von "undefiniert" ausgehen. Das bedeutet, dass ich als Entwickler mich selbst um die Reihenfolge kuemmern muss, falls dies in meinem Code relevant ist und dass die Reihenfolge der Qt-Maintainer auch geaendert werden darf (z.B. falls in solchen Methoden irgendwelche Fehler behoben werden muessen oder interne Algorithmen aendern).

Verfasst: 8. Januar 2009 15:31
von sigvdr
Hallo,

ich muss ja zugeben, dass die Titelzeile hier etwas ungünstig gewählt war!
Nach Umstellung auf QT 4.4.3 ist aber die Reihenfolge der Reihen nicht mehr gleich.
jetzt kommt ( mehr oder weniger zufällig ) z.B.
für eine Spalte z.B. selectedRows(3) die Zellen:
Zelle(Spalte3,Reihe5) , Zelle(Spalte3,Reihe4) , Zelle(Spalte3,Reihe6)
und für eine Spalte z.B. selectedRows(5) die Zellen:
Zelle(Spalte5,Reihe6) , Zelle(Spalte5,Reihe5) , Zelle(Spalte5,Reihe4)

Darf ich jetzt erwarten, dass die Reihenfolge der Reihen für jede Spalte gleich ist ( wie bei QT4.3.4 ) und ist demnach QT4.4.3 fehlerhaft ?
Mir ging es weniger um sortiert sondern mehr darum, dass die Reihenfolge in der die Zellen angegeben werden auch für einen wiederholten Funktionsaufruf die selbe bleibt solange sich an der Selektion nichts verändert hat. Meine Erfahrung hat mir bisher gezeigt, dass wenn die Ergebnisse meiner Funktionen wie bei diesem Fall hier nach dem Zufallsprinzip ( wenn auch zunächst formal richtig ) ausfallen, ich auch irgendwo einen "Bock geschossen" habe.

Und wie schon richtig angemerkt, hilft jetzt für den Moment nur sortieren!
z.B. so wie hier:

Code: Alles auswählen

bool sortModelIndexListCompareRows(const QModelIndex &first, const QModelIndex &next){
	return first.row() < next.row();
}

QString QDragTableView::selectedRows(QList<int> columns){
   QList<QModelIndexList> cols;
   int colCount = columns.count();
   for ( int c = 0 ; c < colCount ; c++) {
      cols.append(selectionModel()->selectedRows(columns[c]));
      qStableSort(cols[c].begin(),cols[c].end(),sortModelIndexListCompareRows);
   }
   QString zelle = "";
   QString text = "";
   for ( int i = 0; i < cols[0].count(); i++) {
      for ( int c = 0 ; c < colCount ; c++) {
         zelle = "("+QString::number(cols[c][i].row())+":"+QString::number(cols[c][i].column())+")";
         text += zelle;
      }
   }
   return text;
}

Gruß Sig