certflow.views.bases.base_dialog 源代码

"""对话框基类(重构计划阶段 1,对应蓝图 §7.2 任务 1.3 widgets 收敛)。

职责归位(REFACTOR §2.4):按钮栏与危险确认逻辑统一收敛进 ``widgets/``,本基类仅作
**组合基类**,复用共享件而非自行实现:

- 底部标准按钮栏(确认 / 取消 / 应用)由 ``widgets.DialogButtonBar`` 提供,按内容定宽、
  右对齐,发出 ``accepted`` / ``rejected`` / ``applied``。
- 危险操作二次确认由 ``widgets.ConfirmDialog.danger`` 提供(见 ``confirm_danger``),
  集中危险样式与文案,避免各对话框手写 ``QMessageBox.question``。
- 顶部工具栏请使用 ``widgets.ActionToolbar``(``button_row.py``),与对话框底部按钮栏
  职责分离:``ActionToolbar`` 面向视图工具条(左对齐、按内容定宽),``DialogButtonBar``
  面向对话框底部(右对齐、带信号)。

- 内容区布局 ``content_layout``:子类往里填充控件 / 子布局。
- Esc 关闭(``QDialog`` 默认行为,显式保证)。
- 尺寸策略:``SetMinimumSize``,对话框收缩到内容、不撑满整行(呼应布局修复第 2.2 节)。

非破坏性:仅提供标准骨架,现有复杂对话框(如 ``import_dialog``)仍可保持手写布局。
"""

from __future__ import annotations

from PySide6.QtCore import Signal
from PySide6.QtWidgets import QDialog, QLayout, QSizePolicy, QVBoxLayout, QWidget

from certflow.widgets.dialog_button_bar import DialogButtonBar


[文档] class BaseDialog(QDialog): """标准对话框基类。 用法:: class MyDialog(BaseDialog): def init_ui(self) -> None: self.content_layout.addWidget(QLabel("内容")) dlg = MyDialog(self, title="编辑", confirm_text="保存") if dlg.exec(): ... 按钮栏信号已接线:``accepted -> accept()``、``rejected -> reject()``、 ``applied -> self.applied``(可选「应用」按钮)。 """ # 透传「应用」信号(仅当 show_apply=True 时按钮存在) applied = Signal() def __init__( self, parent: QWidget | None = None, title: str = "", show_apply: bool = False, confirm_text: str = "确认", cancel_text: str = "取消", ) -> None: super().__init__(parent) if title: self.setWindowTitle(title) self._main_layout = QVBoxLayout(self) self._main_layout.setContentsMargins(16, 16, 16, 16) self._main_layout.setSpacing(12) # 内容区:子类填充 self.content_layout = QVBoxLayout() self.content_layout.setContentsMargins(0, 0, 0, 0) self.content_layout.setSpacing(10) self._main_layout.addLayout(self.content_layout) # 标准按钮栏(共享件 DialogButtonBar:确认/取消/应用,定宽右对齐) self.button_bar = DialogButtonBar( self, show_apply=show_apply, confirm_text=confirm_text, cancel_text=cancel_text ) self.button_bar.accepted.connect(self.accept) self.button_bar.rejected.connect(self.reject) self.button_bar.applied.connect(self.applied) self._main_layout.addWidget(self.button_bar) # 尺寸策略:收缩到内容,不撑满整行 self.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Preferred) self._main_layout.setSizeConstraint(QLayout.SetMinimumSize) self.init_ui()
[文档] def confirm_danger( self, title: str, message: str, preview: str | None = None, ok_text: str = "删除", ok_default: bool = False, ) -> bool: """弹出来自 ``widgets.ConfirmDialog`` 的危险操作二次确认(确认逻辑收敛进 widgets)。 Args: title: 对话框标题。 message: 提示正文。 preview: 可选详情(如待删除记录预览),折叠在「显示详情」里。 ok_text: 确认按钮文案(默认「删除」)。 ok_default: 确认按钮是否默认聚焦(危险操作默认 ``False``,聚焦取消)。 Returns: bool: 用户是否确认。 """ from certflow.widgets.confirm_dialog import ConfirmDialog return ConfirmDialog.danger(self, title, message, preview, ok_text, ok_default)
[文档] def init_ui(self) -> None: """构造对话框内容。子类必须实现,往 ``self.content_layout`` 填充。"""