QTableWidget - event nach erfolgter Sortierung

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
Karsten Böhme
User
Beiträge: 86
Registriert: Sonntag 23. Dezember 2012, 07:54

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
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wie kommen die Daten denn in das Widget? Vielleicht hält das Modell ein Signal dafür vor.
Karsten Böhme
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'.

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
       
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
Karsten Böhme
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
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Kannst du den nicht zur Not einfach austauschen? Der ist leicht bequemer & dafür weniger mächtig.
Karsten Böhme
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.
Karsten Böhme
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.

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