Python Forum
[PyQt] QTableView set header labels
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
[PyQt] QTableView set header labels
#1
Hi!
I have a PyQt5 window with a QTableView. The data comes from a XML file. So far everthing works fine.
But now I want to set the header labels because in XML data there is no first line with the labels.
. self.model2 = QStandardItemModel()
. self.model2.setHorizontalHeaderLabels(['ID', 'Datum', 'Gewicht', 'Bmkg'])
. self.tableView.setModel(self.model2)
would do that but I have a own class for column formatting and the 2 can't be combined.
What I have so far:

import sys
import xml.etree.ElementTree as ET
from PyQt5 import QtCore, QtGui, QtWidgets, uic
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QStandardItemModel
from GewichtUI import Ui_MainWindow    # UI file from Qt Designer


# table format class
# see https://www.pythonguis.com/tutorials/qtableview-modelviews-numpy-pandas/
class TableModel(QtCore.QAbstractTableModel):
    def __init__(self, data):
        super(TableModel, self).__init__()
        self._data = data

    def data(self, index, role):

        if role == Qt.DisplayRole:
            #return self._data[index.row()][index.column()]
            value = self._data[index.row()][index.column()]

            if index.column() == 2:    # Betrag
                return "%.1f" % float(value)
            #elif index.column() == 1:  # Datum
            #    return value.strftime("%Y-%m-%d")
            else:
                return value

        if role == Qt.TextAlignmentRole:
            value = self._data[index.row()][index.column()]

            if index.column() == 0 or index.column() == 2:   # ID, Betrag
                return Qt.AlignmentFlag.AlignVCenter + Qt.AlignmentFlag.AlignRight
            else:
                return Qt.AlignmentFlag.AlignVCenter


    def rowCount(self, index):
        # The length of the outer list.
        return len(self._data)

    def columnCount(self, index):
        # The following takes the first sub-list, and returns
        # the length (only works if all rows are an equal length)
        return len(self._data[0])



class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
    def __init__(self, *args, obj=None, **kwargs):
        super(MainWindow, self).__init__(*args, **kwargs)
        self.setupUi(self)

        # read XML data
        tree = ET.parse("GewichtDaten.xml")
        root = tree.getroot()
        data = []
        for elem in root:
            datar = []
            for subelem in elem:
                datar.append(subelem.text)
            if len(datar) == 3:
                datar.append("")
            data.append(datar)

        # QTableView
        self.model = TableModel(data)
        self.tableView.setModel(self.model)
        #self.model2 = QStandardItemModel()             # <<<<<<<<  this 3 lines can't be combined with the upper 2 lines
        #self.model2.setHorizontalHeaderLabels(['ID', 'Datum', 'Gewicht', 'Bmkg'])
        #self.tableView.setModel(self.model2)

        self.tableView.verticalHeader().setVisible(False)
        #self.tableView.resizeColumnsToContents()
        self.tableView.setColumnWidth(0,  60)
        self.tableView.setColumnWidth(1, 115)
        self.tableView.setColumnWidth(2,  65)
        self.tableView.setColumnWidth(3, 230)
        self.tableView.scrollToBottom()   # go to last

        # ................

app = QtWidgets.QApplication(sys.argv)
window = MainWindow()
window.show()
app.exec()
Reply
#2
        self.tableView.setHorizontalHeaderItem(0, QTableWidgetItem("ID"))
        self.tableView.setHorizontalHeaderItem(1, QTableWidgetItem("Datum"))
        self.tableView.setHorizontalHeaderItem(2, QTableWidgetItem("Gewicht"))
        self.tableView.setHorizontalHeaderItem(3, QTableWidgetItem("Bmkg"))
Oh, sorry this is for QTableWidget.
Reply
#3
Problem solfed in table format class:
# table format class
class TableModel(QtCore.QAbstractTableModel):
    def __init__(self, data):
        super(TableModel, self).__init__()
        self._data = data
        #self.rows_nr, self.columns_nr = data.shape
        self.hheaders = ["ID", "Datum", "Gewicht", "Bmkg"]           # <<<<<<<<<<<<<<< NEW LINE

    def data(self, index, role):

        if role == Qt.DisplayRole:
            value = self._data[index.row()][index.column()]

            if index.column() == 2:    # Betrag
                return "%.1f" % float(value)
            #elif index.column() == 1:  # Datum
            #    return value.strftime("%Y-%m-%d")
            else:
                return value

        if role == Qt.TextAlignmentRole:
            value = self._data[index.row()][index.column()]

            if index.column() == 0 or index.column() == 2:   # ID, Betrag
                return Qt.AlignmentFlag.AlignVCenter + Qt.AlignmentFlag.AlignRight
            else:
                return Qt.AlignmentFlag.AlignVCenter


    def rowCount(self, index):
        # The length of the outer list.
        return len(self._data)

    def columnCount(self, index):
        # The following takes the first sub-list, and returns
        # the length (only works if all rows are an equal length)
        return len(self._data[0])

    def headerData(self, section, orientation, role):           # <<<<<<<<<<<<<<< NEW DEF
        # row and column headers
        if role == QtCore.Qt.DisplayRole:
            if orientation == QtCore.Qt.Horizontal:
                return self.hheaders[section]
        return QtCore.QVariant()
Reply


Possibly Related Threads…
Thread Author Replies Views Last Post
  [PyQt] PyQt5 QTableView SQLite : edit cell HeinKurz 2 2,281 Mar-27-2023, 10:41 AM
Last Post: HeinKurz
  [PyQt] QStyledItemDelegate and QTableView malonn 1 1,598 Feb-07-2023, 07:15 PM
Last Post: malonn
  [PyQt] Determine whether text in QTableView cell is fully visible or not random_nick 0 955 Oct-27-2022, 09:29 PM
Last Post: random_nick
  [PyQt] QTableView: scroll to top cell of the screen random_nick 2 2,765 Oct-08-2022, 12:29 AM
Last Post: random_nick
  [PyQt] [Solved]Add a Blank Row To QTableView Extra 3 5,368 Oct-02-2022, 04:53 PM
Last Post: Extra
  How to update the list of a combo box in a QTableView panoss 10 6,130 Feb-05-2022, 03:24 PM
Last Post: panoss
  [PyQt] How to Copy-Paste a table from Office apps to QTableView? Vittorio 5 7,133 Aug-05-2021, 11:14 AM
Last Post: Axel_Erfurt
  [PyQt] Qtableview adapte size to WBPYTHON 3 11,095 Mar-23-2020, 01:51 AM
Last Post: deanhystad
  [PyGUI] Showing text in QTableView sequence 0 3,026 Jan-20-2019, 05:00 PM
Last Post: sequence
  [PySide2][PyQt5] update QTableView cpuin 0 5,223 Mar-07-2018, 10:20 PM
Last Post: cpuin

Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020