certflow.widgets.button_row 源代码

"""按钮簇工具栏。

从动作列表生成一排按钮,**按内容定宽**、不做 ``addStretch()`` 均分(呼应重构计划
第 2.2 节「工具栏按内容定宽」)。适用于各视图顶部「新增/编辑/删除/刷新」之类的
按钮行,替代每处手写的 ``QHBoxLayout`` + ``QPushButton`` + ``addStretch``。
"""

from __future__ import annotations

from collections.abc import Callable

from PySide6.QtWidgets import QHBoxLayout, QPushButton, QWidget


[文档] class ActionToolbar(QWidget): """一排动作按钮,按内容定宽。 用法:: bar = ActionToolbar() bar.add_button("➕ 新增", self.on_add) bar.add_button("🗑️ 删除", self.on_delete, danger=True) bar.add_stretch() bar.add_button("🔄 刷新", self.refresh) """ def __init__(self, parent: QWidget | None = None, align: str = "left") -> None: super().__init__(parent) self._layout = QHBoxLayout(self) self._layout.setContentsMargins(0, 0, 0, 0) self._layout.setSpacing(6) if align == "right": self._layout.addStretch()
[文档] def add_button( self, label: str, slot: Callable[[], None] | None = None, tooltip: str | None = None, primary: bool = False, danger: bool = False, ) -> QPushButton: """追加一个按钮;``slot`` 不为空则连接点击事件。""" btn = QPushButton(label) if tooltip: btn.setToolTip(tooltip) if primary: btn.setObjectName("primaryButton") elif danger: btn.setObjectName("dangerButton") if slot is not None: btn.clicked.connect(slot) self._layout.addWidget(btn) return btn
[文档] def add_widget(self, widget: QWidget) -> None: self._layout.addWidget(widget)
[文档] def add_stretch(self) -> None: self._layout.addStretch()