User Tools

Site Tools


python_qtableview

QTableview benutzen

Zuerst muss ein TableModel erstellt werden.

Muster: /home/walter/projekte/bestellungen/v3/clTableModel.py

from PyQt6.QtCore import Qt, QAbstractTableModel, pyqtSignal
from PyQt6.QtGui  import QIcon, QPixmap, QImage, QStandardItemModel, QColor
 
class TableModel(QAbstractTableModel):
    """ Modell für die Tabelle mit 5 Spalten """
    def __init__(self, data):  # =False):
        super(TableModel, self).__init__()
        self._data = data
        self.model = QStandardItemModel(self) #Neu
        self.horizontalHeaders = [''] * 5
        self.setHeaderData(0, Qt.Orientation.Horizontal, "Dateiname")
        self.setHeaderData(1, Qt.Orientation.Horizontal, "Datum")
        self.setHeaderData(2, Qt.Orientation.Horizontal, "Breite")
        self.setHeaderData(3, Qt.Orientation.Horizontal, "Höhe")
        self.setHeaderData(4, Qt.Orientation.Horizontal, "GPS")
 
    def headerData(self, section, orientation, role=Qt.ItemDataRole.DisplayRole):
        if orientation == Qt.Orientation.Horizontal and role == Qt.ItemDataRole.DisplayRole:
            try:
                return self.horizontalHeaders[section]
            except:
                pass
        return super().headerData(section, orientation, role)
 
    def setHeaderData(self, section, orientation, data, role=Qt.ItemDataRole.EditRole):
        if orientation == Qt.Orientation.Horizontal \
        and role in (Qt.ItemDataRole.DisplayRole, Qt.ItemDataRole.EditRole):
            try:
                self.horizontalHeaders[section] = data
                return True
            except:
                return False
        return super().setHeaderData(section, orientation, data, role)
 
     def data(self, index, role):
        v = self._data[index.row()][index.column()]
        if role == Qt.ItemDataRole.DisplayRole:
            if index.column() < 5:
                return v
        if role == Qt.ItemDataRole.TextAlignmentRole:
            if index.column() in [2,3]:
                return Qt.AlignmentFlag.AlignRight + Qt.AlignmentFlag.AlignVCenter
            # USW.
 
    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)
        if len(self._data) == 0:
            return 0
        else:
            return len(self._data[0])
 
    def sort(self, Ncol, order):
        """Sort table by given column number """
        #print(f"sort .. {Ncol=}")
        try:
            self.layoutAboutToBeChanged.emit()
            # print(f"{type(self_data)=}")
            self._data = self._data.sort_values(self._data.columns[Ncol], ascending=not order)
            self.layoutChanged.emit()
        except Exception as e:
            print(e)

Nun kann eine Erweiterung von QTableview erstellt werden.

Muster /home/walter/projekte/bestellungen/v2/list-version/clBestelltabelle.py

from PyQt6.QtWidgets import (
        QMainWindow, QApplication,
        QPushButton, QWidget, QTabWidget, QLabel, QLineEdit, QTableWidget, QComboBox,
        QTableView, QHeaderView, QRadioButton, QFormLayout,
        QVBoxLayout, QHBoxLayout, QGridLayout )
from PyQt6.QtGui     import QIcon, QPixmap, QImage, QAction
from PyQt6.QtCore    import pyqtSlot, Qt, QModelIndex
import myInOut
 
from clBestelltabelleModel import TableModel
 
class Bestelltabelle(QTableView):
    """ """
    def __init__(self, data, parent) -> None:
        """ Data enthält die Tabellenwerte als Liste von Listen """
        super().__init__(parent)
        self.parent = parent
        self.data = data
        self.setShowGrid(False)
        self.verticalHeader().setSectionResizeMode(QHeaderView.ResizeMode.ResizeToContents)
        self.verticalHeader().hide()
        self.model = TableModel(data, self.pfad)
        self.setModel(self.model) 
 
    def update(self, data):
        """ Tabelle neu laden """
        self.data = data
        self.model = TableModel(self.data, self.pfad)
        self.setModel(self.model)
        header = self.horizontalHeader()
        spaltenbreite = [80, 250, 120, 80]  # Bild, Info, Bestelldatum, Preis
        for nr, breite in enumerate(spaltenbreite):
            header.setSectionResizeMode(nr, QHeaderView.ResizeMode.Fixed)   # Stretch, Fixed
            self.setColumnWidth(nr, breite) 

Zum Schluss muss die Tabelle in die GUI eingebunden werden:

Muster: /home/walter/projekte/bestellungen/v2/list-version/gui-v2.py

from yyyy import Bestelltabelle
 
    # in init:
        data = [[0,"","","",0]]
        self.bestellTabelle = Bestelltabelle(data, self)
        self.bestellTabelle.clicked.connect(self.table_clicked)
        layout.addWidget(self.bestellTabelle)
 
    def table_clicked(self, signal):
        row = signal.row()
        col = signal.column()
        print(f"{row=} {col=}", flush=True)
        # Zugriff auf Datenzeile (self.data enthält alle Daten
        zeile = self.data[row]
 
    # bei Änderungen - self.data neueinlesen
        self.bestellTabelle.update(self.data)
python_qtableview.txt · Last modified: 2024/06/01 15:29 by walter