Seite 1 von 1

QTableview Tableheader werden nicht gesetzt

Verfasst: Samstag 11. März 2017, 18:58
von nieselfriem
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

Re: QTableview Tableheader werden nicht gesetzt

Verfasst: Samstag 11. März 2017, 20:38
von Axel-Erfurt
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")

Re: QTableview Tableheader werden nicht gesetzt

Verfasst: Samstag 11. März 2017, 21:03
von jerch
@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.

Re: QTableview Tableheader werden nicht gesetzt

Verfasst: Sonntag 12. März 2017, 11:37
von nieselfriem
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

Re: QTableview Tableheader werden nicht gesetzt

Verfasst: Sonntag 12. März 2017, 13:16
von 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().

Re: QTableview Tableheader werden nicht gesetzt

Verfasst: Sonntag 12. März 2017, 15:17
von jerch
@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 ...

Re: QTableview Tableheader werden nicht gesetzt

Verfasst: Sonntag 12. März 2017, 15:29
von nieselfriem
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 ;)