76 lines
No EOL
2.6 KiB
Python
76 lines
No EOL
2.6 KiB
Python
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) |