certflow.views.lookup_tables_dialog 源代码
"""基础数据维护(合并对话框)
将「材质牌号 / 口径映射 / 型号→压力」三个基础字典表的维护界面合并到
一个带标签页(``QTabWidget``)的对话框中,仿「校正队列」的二级 UI 模式,
从主窗口导航栏以单个按钮打开,避免导航栏按钮过多。
每个标签页复用通用基类 ``LookupTableManagerView``,本对话框仅负责分页容器
与跨页的资源清理(子管理器各自持有独立会话,关闭时统一释放)。
"""
from __future__ import annotations
import contextlib
from typing import Any, override
from PySide6.QtWidgets import (
QDialog,
QTabWidget,
QVBoxLayout,
QWidget,
)
from certflow.views.bases.lookup_table_manager_view import LookupTableManagerView
from certflow.views.caliber_mapping_manager_view import CaliberMappingManagerView
from certflow.views.material_grade_manager_view import MaterialGradeManagerView
from certflow.views.model_param_mapping_manager_view import ModelParamMappingManagerView
# 标签页注册表:(标签文本, 管理器类, 标识 key, 字典键名)
# key 用于右键菜单配置驱动时定位到指定标签页(见 config.yaml 的
# ``lookup_tables.context_menu.items[].table``);
# dict_key 用于 DB ↔ CSV 双向同步(对应 dictionaries.yaml 的 dictionary.<dict_key>.csv)。
_TAB_REGISTRY: list[tuple[str, type[LookupTableManagerView], str, str]] = [
("🧪 材质牌号", MaterialGradeManagerView, "material_grade", "material_grades"),
("📐 口径映射", CaliberMappingManagerView, "caliber_mapping", "caliber_mappings"),
("🔧 型号→压力", ModelParamMappingManagerView, "model_param", "model_param_mappings"),
]
[文档]
class LookupTablesDialog(QDialog):
"""基础数据维护合并对话框(标签页容器)"""
def __init__(
self,
db_manager: Any = None,
session: Any = None,
initial_table: str | None = None,
parent: QWidget | None = None,
) -> None:
"""初始化合并对话框
Args:
db_manager: 数据库管理器(优先);传入后各子管理器持有独立会话
session: 外部会话(与 db_manager 二选一)
initial_table: 初始选中的标签页标识(见 ``_TAB_REGISTRY`` 的 key)
parent: 父窗口
"""
super().__init__(parent)
self.setWindowTitle("基础数据维护")
self.setMinimumSize(1080, 660)
self.resize(1180, 740)
self._db_manager = db_manager
self._session = session
self._managers: list[LookupTableManagerView] = []
self._init_ui(initial_table)
def _init_ui(self, initial_table: str | None) -> None:
layout = QVBoxLayout(self)
layout.setContentsMargins(10, 10, 10, 10)
layout.setSpacing(8)
tabs = QTabWidget()
initial_index = 0
for idx, (label, cls, key, dict_key) in enumerate(_TAB_REGISTRY):
mgr = cls(
db_manager=self._db_manager,
session=self._session,
dict_key=dict_key,
parent=self,
)
self._managers.append(mgr)
tabs.addTab(mgr, label)
if key == initial_table:
initial_index = idx
tabs.setCurrentIndex(initial_index)
layout.addWidget(tabs)
[文档]
@override
def closeEvent(self, event: Any) -> None:
"""关闭时统一释放各子管理器的控制器会话。
子管理器作为标签页嵌入本对话框,不会触发自身 ``closeEvent``,
需在此显式清理,避免会话泄漏。
"""
for mgr in self._managers:
with contextlib.suppress(Exception): # pragma: no cover - 防御性
mgr._controller.close()
super().closeEvent(event)