Jan-21-2023, 11:10 AM
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:
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()