====== 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)