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