Hallo,
ich würde gerne eine Tabelle die ich als QTableWidget realisiert habe nach mehreren Kriterien sortieren. Also z.B. erst absteigend nach Spalte 1 und dann aufsteigend nach Spalte 2.
Den Inhalt nach einer Spalte zu sortieren kann ich über "sortItems" realisieren und natürlich im Widget über einen linken Mausklick auf die Spaltenüberschrift, aber wie kann ich eine Sortierung nach dem zweiten Kriterium realisieren?
Weiß jemand Rat?
Tabelle (QTableWidget) nach mehreren Kriterien sortieren
Python's Sortierung ist stabil. Das heisst, dass sie Eintraege A und B, die nacheinander in einer Liste stehen, auch nach einer Sortierung in derselben Reihenfolge stehen, wenn das Kriterium zum sortieren die Eintraege auf derselben Stelle belassen kann - weil es gleich ist. Hm, hoert sich schwieriger an, als es ist:
Wie du siehst, bleibt die Sortierung der Eintraege innerhalb der Nachnamen die "c_nachname" sind stabil bezueglich der zuerst getaetigten Sortierung nach vorname, absteigend.
Um also zu deinem Problem zurueck zu kommen: erst nach der zweiten Spalte sortieren, durch Druck auf den Header. Dann auf die Haupt-Spalte. So machen das auch Excel & Co.
Code: Alles auswählen
import pprint
names = [
("c_nachname", "c_vorname"),
("a_nachname", "b_vorname"),
("c_nachname", "a_vorname"),
]
names = reversed(sorted(names, key=lambda name: name[1])) # nachname absteigend
names = sorted(names, key=lambda name: name[0])
pprint.pprint(names)
Um also zu deinem Problem zurueck zu kommen: erst nach der zweiten Spalte sortieren, durch Druck auf den Header. Dann auf die Haupt-Spalte. So machen das auch Excel & Co.
-
- User
- Beiträge: 5
- Registriert: Sonntag 7. August 2011, 14:51
Vielen Dank für Deine Antwort.deets hat geschrieben: Um also zu deinem Problem zurueck zu kommen: erst nach der zweiten Spalte sortieren, durch Druck auf den Header. Dann auf die Haupt-Spalte. So machen das auch Excel & Co.
Das heisst dann aber, dass ich den Klick auf den Header abfangen und die Sortierung selbst implementieren muss, richtig? Das QTableWidget bietet ja schon eine Sortierfunktion, aber die erlaubt nur einen Klick und sortiert dann immer auf- oder absteigend nach der entsprechenden Spalte.
@Splash-1st: Das heißt einfach nur, dass der Benutzer eben zuerst auf die zweite und dann auf die erste Spalte klicken muss, um so zu sortieren. Im Programm kannst Du dasselbe Verhalten erreichen, indem Du ".sortItems()" zuerst auf der zweiten, und anschließend auf der ersten Spalte aufrufst.
-
- User
- Beiträge: 5
- Registriert: Sonntag 7. August 2011, 14:51
Ohja, irgendwie habe ich das gar nicht bemerkt, dass es ja schon so funktioniert wie ich es haben wollte. Trotzdem vielen Dank für den Schubs in die richtige Richtung!