from PyQt6.QtWidgets import ( QWidget, QTableView, QHBoxLayout, QVBoxLayout, QDateEdit, QPushButton, QLabel, QHeaderView, QAbstractItemView, ) from PyQt6.QtSql import QSqlTableModel class TabWidgetCustom(QWidget): """ Универсальный виджет для CRUD операций с таблицей БД. Отображает данные через QSqlTableModel с тулбаром действий. """ def __init__(self, table_name: str, db, show_date_filter=False): super().__init__() self._name = table_name self._db = db self._show_date_filter = show_date_filter self._setup() def _setup(self): self.root = QVBoxLayout(self) if self._show_date_filter: self.header = QHBoxLayout() self.from_date = QDateEdit() self.from_date.setCalendarPopup(True) self.to_date = QDateEdit() self.to_date.setCalendarPopup(True) self.button_filter = QPushButton("Filter") self.button_all = QPushButton("Show All") self.header.addWidget(QLabel("From:")) self.header.addWidget(self.from_date) self.header.addWidget(QLabel("To:")) self.header.addWidget(self.to_date) self.header.addWidget(self.button_filter) self.header.addWidget(self.button_all) self.root.addLayout(self.header) self.view = QTableView() self.view.setSelectionBehavior( QAbstractItemView.SelectionBehavior.SelectRows ) self.view.horizontalHeader().setSectionResizeMode( QHeaderView.ResizeMode.Stretch ) self.view.setAlternatingRowColors(True) self.btoolbar = QHBoxLayout() self.button_add = QPushButton("+ Добавить") self.button_del = QPushButton("- Удалить") self.button_ok = QPushButton("✓ Применить") self.button_deny = QPushButton("✗ Отменить") self.button_csv = QPushButton("Экспорт CSV") for btn in (self.button_add, self.button_del, self.button_ok, self.button_deny, self.button_csv): self.btoolbar.addWidget(btn) self.root.addWidget(self.view) self.root.addLayout(self.btoolbar) self._setup_db() def _setup_db(self): self.model = QSqlTableModel(db=self._db) self.model.setTable(self._name) self.model.setEditStrategy(QSqlTableModel.EditStrategy.OnManualSubmit) self.model.select() self.view.setModel(self.model)