QTableview Tableheader werden nicht gesetzt

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
Benutzeravatar
nieselfriem
User
Beiträge: 135
Registriert: Sonntag 13. Januar 2013, 16:00

Hallo zusammen,

ich habe folgendes Tabellenmodel zusammengefriemelt:

Code: Alles auswählen

rom PyQt5 import QtCore
from PyQt5 import QtGui
from PyQt5 import Qt

class TableModel(QtCore.QAbstractTableModel):
    def __init__(self, datas=[[]], parent = None):
        QtCore.QAbstractListModel.__init__(self, parent)
        self.__datas = datas

    def rowCount(self, parent):
        return len(self.__datas)

    def columnCount(self, parent):
        return len(self.__datas[0])

    def flags(self, index):
        return QtCore.Qt.ItemIsEditable | QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsSelectable

    def data(self, index, role):
        if role == QtCore.Qt.EditRole:
            row = index.row()
            column = index.column()
            return self.__datas[row][column]
        if role == QtCore.Qt.DisplayRole:
            row = index.row()
            column = index.column()
            value = self.__datas[row][column]
            return value

    def setData(self, index, value, role=QtCore.Qt.EditRole):
        if role == QtCore.Qt.EditRole:
            row = index.row()
            column = index.column()
            data = value
            self.__datas[row][column] = data
            self.dataChanged.emit(index, index)
            return True
Die Daten werden durch ein zweidimensionales Array eingefügt. Nun werden die Tabellenköpfe jedoch noch mit 1,2,3 usw. angezeigt.

Dazu wollte ich einfach dem Model die Bezeichnung der Header hinzufügen

ein

Code: Alles auswählen

setHeaderData(0, QtCore.Qt.Horizontal, "Test")
im Konstruktor vom Tabellenmodel TableModel hat ebenso wenig gebracht wie ein

Code: Alles auswählen

model = TableModel(my_array)
model.setHeaderData(0, QtCore.Qt.Horizontal, "Test")
Diese Anweisungen werden einfach ignoriert.

Was mach ich falsch?

VG niesel
Axel-Erfurt
User
Beiträge: 20
Registriert: Mittwoch 2. Oktober 2013, 22:15

Test in PyQt5

z.B. in init

Code: Alles auswählen

self.model =  QtGui.QStandardItemModel(self)
dann funktioniert

Code: Alles auswählen

self.model.setHeaderData(0, QtCore.Qt.Horizontal, "Test")
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

@nieselfriem:
Wenn Du direkt von den abstrakten Modelklassen ableitest, sind die meisten Methoden ohne oder nur mit rudimentärer Funktionalität. Überlage für die Koptzeilen die Methode `headerData`.

Zwei Anmerkungen zum Code: Den default-Wert eines Keyword-Argumentes auf einen mutuable type setzen (Dein `datas=[[]]`), führt in Python mitunter zu unerwünschtem Verhalten, daher besser mit `None` arbeiten und explizit im Code prüfen. Warum der doppelte Unterstrich bei `self.__datas`? Konvention zum Anzeigen privater Attribute ist ein Unterstrich. Übrigens ist Data ein Mehrzahlwort, Singular ist Datum.
Benutzeravatar
nieselfriem
User
Beiträge: 135
Registriert: Sonntag 13. Januar 2013, 16:00

Hallo zusammen,

ich habe nun den Konstruktor wie folgt abgewandelt:

Code: Alles auswählen

class TableModel(QtCore.QAbstractTableModel):
    def __init__(self, data=None, parent = None):
        QtCore.QAbstractListModel.__init__(self, parent)
        self._data = data
        self.model = QtGui.QStandardItemModel(self) #Neu
        self.model.setHeaderData(0, QtCore.Qt.Horizontal, "Test")#Neu
Dennoch werden die Header nicht gesetzt. :K


VG
BlackJack

@nieselfriem: Wo und wie hast Du denn nun `headerData()` implementiert? Um mal aus der Qt-Dokumentation zum Subclassing von `QAbstractTableModel` zu zitieren: „Well behaved models will also implement headerData().
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

@nieselfriem:
Das mit dem `self.model = QtGui.QStandardItemModel(self)` im Konstruktor Deines Models ist ziemlicher Unsinn. Entweder Du nutzt `QStandardItemModel` als Model mit allen Vor- und Nachteilen, oder Du erweiterst Deine eigene Modelklasse so, dass die API korrekt umgesetzt ist. Für die Kopfzeilen musst Du mindestens die `headerData`-Methode implementieren:

Code: Alles auswählen

    def headerData(self, section, orientation, role):
        # get from somewhere header data
        # for a section X orientation X role
        return ...
Benutzeravatar
nieselfriem
User
Beiträge: 135
Registriert: Sonntag 13. Januar 2013, 16:00

Hallo zusammen,

ich habe mir das ganze noch mal überdacht was ihr mir so geschrieben habt und habe es nu tatsächlich hinbekommen ;)

Komisch, kaum macht man es richtig, funktioniert's ;)
Antworten