Seite 1 von 1

QTableView nach zwei oder mehr Spalten sortieren

Verfasst: 20. März 2010 01:09
von ska
Hallo,

ich verwende Qt4.6 und dessen Qt Designer, um in einem QTableView SQL Tabellen anzuzeigen. Das klappt soweit.

Allerdings haben die Tabellen keinen echten Primary Key bzw. einen, der mehrere Spalten umfaßt. Wird nun im View nach einer Spalte sortiert, die einen Wert mehrfach enthält, werden die Zeilen in zufälliger Reihenfolge angezeigt, was sich durchaus ändert, wenn man Werte ändert.


Bsp.:
Eine SQL Tabelle mit den Felder A bis G; A & B bilden gemeinsam den Primary Key.

Nun wird nach A sortiert. Die Zeilen werden so dargestellt, daß alle Zeilen mit demselben Wert in A unmittelbar hintereinander stehen, die Werte in B haben jedoch eine zufállige Reihenfolge. Diese Reihenfolge ändert sich sogar, wenn man Werte in B bis G ändert.

Kann ich dem QTableView beibringen, wenn nach einer der Spalten C bis G sortiert werden soll (Click auf horizontalem Header oder sortByColumn()-Funktion), zusätzlich nach A und B sortiert wird; bei A und B entsprechend, jedoch die Spalte nur einmal.

Es müßte beim ORDER BY der SQL Abfrage nicht nur ein Feld, sondern mehrere angegeben werden.

Danke, Steffen

Verfasst: 26. März 2010 15:12
von Troll.Soft
Hallo ska,

- es gibt keinen unechten Primary Key
- es ist völlig egal über wieviel Spalten der Primary Key läuft
- der Primary Key oder sonstige andere Indizes haben mit ein Sortierung nichts zu tun
- sortiert wird über "order by Spaltenname" in deinem Fall z.B.

Code: Alles auswählen

select * from Table
where  ...  
order by A asc, B asc;
check Deinen Sql-Code am Besten erst einmal in einer SQL-Konsole

tschüß
TrollSoft

Verfasst: 26. März 2010 15:28
von ska
Hallo TrollSoft,

OK, und wie sag' ich's dem QTableView? Der ist ja dafuer verantwortlich, dem Model die Daten in der richtigen Reihenfolge zu entlocken.

Muss ich eine eigene QSqlTableModel Klasse dafuer ableiten? Derzeit verwende ich QSqlTableModel bzw. QSqlRelationalTableModel als Model.

Tschuess, Steffen

Verfasst: 26. März 2010 15:57
von Troll.Soft
ska hat geschrieben: OK, und wie sag' ich's dem QTableView? Der ist ja dafuer verantwortlich, dem Model die Daten in der richtigen Reihenfolge zu entlocken.
Hallo Steffen,
dem View sagst Du nichts, der viewt nur. Das Model ist für die Daten verantwortlich. Das beinflußt Du z.B. so

Code: Alles auswählen

void QSqlTableModel::setSort ( int column, Qt::SortOrder order )   [virtual]
Sets the sort order for column to order. This does not affect the current data, to refresh the data using the new sort order, call select().

See also sort(), select(), and orderByClause()
ich persönlich nutze Code etwa in dieser Form.

Code: Alles auswählen

	QSqlQuery Query;
	Query.exec("select * from ... where ... order by ...");
	QSqlTableModel::setQuery(Query);
tschüß
TrollSoft