import typing import pandas as pd from PyQt6.QtWidgets import QMainWindow, QTableView from PyQt6 import uic, QtGui, QtCore from PyQt6.QtCore import Qt from banking_breakdown.ui.generated import Ui_MainWindow class PandasModel(QtCore.QAbstractTableModel): def __init__(self, df: pd.DataFrame, parent=None): QtCore.QAbstractTableModel.__init__(self, parent) self._data = df self._horizontalHeaders = [''] * len(df.columns) for i, column in enumerate(df.columns): self.setHeaderData(i, Qt.Orientation.Horizontal, column) def setHeaderData(self, section, orientation, data, role=Qt.ItemDataRole.EditRole): if ((orientation == Qt.Orientation.Horizontal) and ((role == Qt.ItemDataRole.DisplayRole) or (role == Qt.ItemDataRole.EditRole))): self._horizontalHeaders[section] = data return True else: return super().setHeaderData(section, orientation, data, role) def headerData(self, section, orientation, role=Qt.ItemDataRole.DisplayRole): if (orientation == Qt.Orientation.Horizontal and role == Qt.ItemDataRole.DisplayRole): return self._horizontalHeaders[section] else: return super().headerData(section, orientation, role) def rowCount(self, parent=None): return len(self._data.values) def columnCount(self, parent=None): return self._data.columns.size def data(self, index, role=Qt.ItemDataRole.DisplayRole): if not index.isValid(): return QtCore.QVariant() if role != Qt.ItemDataRole.DisplayRole: return QtCore.QVariant() item = self._data.iloc[index.row()].iloc[index.column()] if type(item) is pd.Timestamp: return QtCore.QVariant(item.strftime('%Y-%m-%d')) else: return QtCore.QVariant(str(item)) class GeneratedWindowWrapper(QMainWindow): def __init__(self, ui_file: str, categories: typing.Sequence): super(GeneratedWindowWrapper, self).__init__() self._window = Ui_MainWindow() self._window.setupUi(self) # Set up window self._window.statementTableView.setSelectionBehavior( QTableView.SelectionBehavior.SelectRows) self._set_categories(categories) def _set_categories(self, categories: typing.Sequence[str]): model = QtGui.QStandardItemModel() self._window.categoryListView.setModel(model) for category in categories: item = QtGui.QStandardItem(category) model.appendRow(item) def set_statement_data(self, df: pd.DataFrame): model = PandasModel(df) self._window.statementTableView.setModel(model)