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`` 填充。"""