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