Seite 1 von 1
QTableWidget - event nach erfolgter Sortierung
Verfasst: Montag 1. Februar 2021, 08:16
von Karsten Böhme
Hallo miteinander,
ich arbeite an einer Datenbankanwendung, deren Daten ich in einem QTableWidget anzeige. Verschiedene Datensätze markiere ich durch Änderung der Hintergrundfarbe im Zeilenheader. Das funktioniert alles sehr gut, bis ich beginne die Daten durch einen Klick auf einen Spaltenheader zu sortieren. Meine Idee war, über das Ereignis sortIndicatorChanged die Markierungen an die Änderungen anzupassen. Musste aber feststellen, dass dieses Ereignis vor dem Sortiervorgang ausgelöst wird und ich damit noch am ursprünglichen Zustand der Tabelle herumbastel.
Welches Event wird nach erfolgter Sortierung ausgelöst. Ich bin da bis jetzt nicht fündig geworden.
Vielen Dank für Eure Tips
Karsten
Re: QTableWidget - event nach erfolgter Sortierung
Verfasst: Montag 1. Februar 2021, 08:58
von __deets__
Wie kommen die Daten denn in das Widget? Vielleicht hält das Modell ein Signal dafür vor.
Re: QTableWidget - event nach erfolgter Sortierung
Verfasst: Montag 1. Februar 2021, 09:22
von Karsten Böhme
vereinfacht so :
Dabei ist tw das TableWidget, create_tw_datetime_item ist eine Methode, welche ein Item zur Anzeige von Datum und Zeit zurück gibt. Ganz unten die Markierung des Zeilenheaders in Abhängighkeit vom Inhalt der Zelle 'action'.
Code: Alles auswählen
i = tw.rowCount()
for row in result:
tw.setItem(i, 0, QTableWidgetItem(str(row.id)))
tw.setItem(i, 1, QTableWidgetItem(row.net))
tw.setItem(i, 2, QTableWidgetItem(row.reporter))
tw.setItem(i, 3, QTableWidgetItem(row.reporter_func))
tw.setItem(i, 4, create_tw_datetime_item(row.event_time, alignment=Qt.AlignCenter))
if row.action == 'changed':
vh_item: QTableWidgetItem = QTableWidgetItem(str(i + 1))
vh_item.setBackground(Qt.yellow)
vh_item.setForeground(Qt.black)
tw.setVerticalHeaderItem(i, vh_item)
elif row.action == 'deleted':
vh_item: QTableWidgetItem = QTableWidgetItem(str(i + 1))
vh_item.setBackground(Qt.darkRed)
vh_item.setForeground(Qt.white)
tw.setVerticalHeaderItem(i, vh_item)
else:
tw.setVerticalHeaderItem(i, None)
i = i + 1
Re: QTableWidget - event nach erfolgter Sortierung
Verfasst: Montag 1. Februar 2021, 10:13
von __deets__
Das ist nicht gut. Man kann mit dem View so arbeiten, aber eigentlich ist der dazu gedacht, mit einem Model zusammen zu arbeiten. Das Model kann dann die Darstellung der einzelnen Zellen beeinflussen, durch DsipalyRollen. Und wird auch selbst aufgefordert dich zu sortieren, wodurch wiederum Kontrolle über “danach” erlangt werden kann, sollte die Rolle nicht ausreichen:
https://doc.qt.io/qt-5/qabstractitemmodel.html#sort
Ich habe jetzt nichts speziell zum Header gesucht, aber im Zweifel kann man auch da nochmal eingreifen.
Re: QTableWidget - event nach erfolgter Sortierung
Verfasst: Montag 1. Februar 2021, 10:47
von Karsten Böhme
Okay, werde mal Deinem Link folgen. Allerdings nutze ich das TableWidget, nicht das TableView.
Vielen Dank
Re: QTableWidget - event nach erfolgter Sortierung
Verfasst: Montag 1. Februar 2021, 11:09
von __deets__
Kannst du den nicht zur Not einfach austauschen? Der ist leicht bequemer & dafür weniger mächtig.
Re: QTableWidget - event nach erfolgter Sortierung
Verfasst: Montag 1. Februar 2021, 11:35
von Karsten Böhme
naja, bißchen gruselt mir davor. Hab schon ne Menge Arbeit investiert. Werde mich aber heute mal damit vertraut machen.
Re: QTableWidget - event nach erfolgter Sortierung
Verfasst: Montag 1. Februar 2021, 17:33
von Karsten Böhme
@__deets__
Ich habe erstmal ne andere Lösung gefunden. Dazu schalte ich beim TableWidget die Sortierung aus und starte diese per Klick auf den Header. Zum Umschalten der Suchrichtung habe ich ne Variable angelegt. Somit kann ich im Anschluss an die Sortierung meine Zeilen-Header entsprechend markieren.
Code: Alles auswählen
def _on_cl_header_clicked_to_sort(self, e):
# method sorted column e
if self.tw_sort_order == Qt.AscendingOrder:
self.table_widget.sortItems(e, Qt.AscendingOrder)
self.tw_sort_order = Qt.DescendingOrder
else:
self.table_widget.sortItems(e, Qt.DescendingOrder)
self.tw_sort_order = Qt.AscendingOrder
for i in range(self.table_widget.rowCount()):
action: str = self.table_widget.item(i, 21).text()
if action == '':
self.table_widget.setVerticalHeaderItem(i, None)
elif action == 'changed':
vh_item: QTableWidgetItem = QTableWidgetItem(str(i + 1))
vh_item.setBackground(Qt.yellow)
vh_item.setForeground(Qt.black)
self.table_widget.setVerticalHeaderItem(i, vh_item)
elif action == 'deleted':
vh_item: QTableWidgetItem = QTableWidgetItem(str(i + 1))
vh_item.setBackground(Qt.darkRed)
vh_item.setForeground(Qt.white)
self.table_widget.setVerticalHeaderItem(i, vh_item)
else:
self.table_widget.setVerticalHeaderItem(i, None)