QAbstractTableModel: Frage zu headerData() Implementierung

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
Gondii
User
Beiträge: 24
Registriert: Freitag 11. September 2015, 05:56

Hallo Leute,

Ich hoffe der Titel ist halbwegs verständlich :D

Ich möchte für mein TableView vertikal eine andere Benennung als horizontal haben. Also eine separate Liste für die Zeilennamen und die Spaltennamen. Dazu habe ich den Konstruktor etwas angepasst, so dass ich als header einen Dictionary mit zwei Listen übergeben kann:

Code: Alles auswählen

class TableModel(QtCore.QAbstractTableModel):

    def __init__(self, table=[[]], headers={}, parent=None):
        QtCore.QAbstractTableModel.__init__(self, parent)
        self.__table = table
        self.__headersHorizontal = headers['horizontal'] # enthält Liste für horizontale Benennung
        self.__headersVertical = headers['vertical'] # enthält Liste vertikale Benennung
die headerData() sieht so aus:

Code: Alles auswählen

    def headerData(self, section, orientation, role):

        if role == QtCore.Qt.DisplayRole:
            if role == QtCore.Qt.Vertical:
                return self.__headersVertical[section]
            else:
                return self.__headersHorizontal[section]
eine Initialisierung würde zum Beispiel so aussehen:

Code: Alles auswählen

...
headerHorizontal = ['A','B','C','D','E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']
headerVertical = [i for i in range(len(headerHorizontal))]
model = TableModel(data,{'vertical': headerHorizontal, 'horizontal': headerVertical})
...
So. Für mich sieht das alles richtig und logisch aus... aber wenn ich damit ein QTableView befüllen will, bekomme ich sowohl vertikal als auch horizontal die gleiche Benennung: Es erscheint ausschließlich der Inhalt der headerVertical-Liste, also die Zahlen. Von den Buchstaben, die horizontal erscheinen sollen keine Spur.

Es ist auch egal ob ich in headerData() nun auf Vertikal:

Code: Alles auswählen

if role is QtCore.Qt.Vertical:
oder auf Horizontal teste:

Code: Alles auswählen

if role is QtCore.Qt.Horizontal:
Wenn ich nur diese Zeile verändere, bleibt das Ergebnis trotzdem das Gleiche, was ja eigentlich nicht sein kann. Oder seh ich da irgendwas verkehrt?

Kann mir Jemand sagen wo hier mein Brett vor dem Kopf ist? ;-)

Danke schonmal,

Gondii
BlackJack

@Gondii: Falls Du nicht tatsächlich versuchst mit ``is`` auf Gleichheit zu testen, zeig mal ein minimales *lauffähiges* Beispiel, welches das Problem illustriert. Denn das sieht sonst alles richtig aus.
Benutzeravatar
Madmartigan
User
Beiträge: 200
Registriert: Donnerstag 18. Juli 2013, 07:59
Wohnort: Berlin

role kann nicht gleichzeitig Qt::DisplayRole und Qt::Vertical sein.

Qt::DisplayRole = 0
Qt::Horizontal = 0x1
Qt::Vertical = 0x2

http://doc.qt.io/qt-4.8/qt.html#ItemDataRole-enum
BlackJack

:oops: Habe ich glatt übersehen…
Benutzeravatar
Madmartigan
User
Beiträge: 200
Registriert: Donnerstag 18. Juli 2013, 07:59
Wohnort: Berlin

BlackJack hat geschrieben::oops: Habe ich glatt übersehen…
Passiert. :wink:
Antworten