QItemSelectionModel::selectedRows sortiert oder unsortiert?

Alles rund um die Programmierung mit Qt
Antworten
sigvdr
Beiträge: 100
Registriert: 1. Juli 2008 19:29

QItemSelectionModel::selectedRows sortiert oder unsortiert?

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

Beitrag von upsala »

Es ist in der Doku nirgends erwähnt, daß es sortiert sein sollte.
sigvdr
Beiträge: 100
Registriert: 1. Juli 2008 19:29

Beitrag 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
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag 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).
sigvdr
Beiträge: 100
Registriert: 1. Juli 2008 19:29

Beitrag 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
Antworten