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
QTableWidget - event nach erfolgter Sortierung
-
- User
- Beiträge: 86
- Registriert: Sonntag 23. Dezember 2012, 07:54
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'.
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
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.
Ich habe jetzt nichts speziell zum Header gesucht, aber im Zweifel kann man auch da nochmal eingreifen.
-
- User
- Beiträge: 86
- Registriert: Sonntag 23. Dezember 2012, 07:54
Okay, werde mal Deinem Link folgen. Allerdings nutze ich das TableWidget, nicht das TableView.
Vielen Dank
Vielen Dank
-
- User
- Beiträge: 86
- Registriert: Sonntag 23. Dezember 2012, 07:54
naja, bißchen gruselt mir davor. Hab schon ne Menge Arbeit investiert. Werde mich aber heute mal damit vertraut machen.
-
- User
- Beiträge: 86
- Registriert: Sonntag 23. Dezember 2012, 07:54
@__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.
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)