certflow.widgets.section_card 源代码

"""统一的「Section 卡片」容器。

消除各窗体手写 ``QGroupBox`` + 布局的重复。一个 SectionCard 即一块带标题的
内容区;字段用 ``add_field`` 走 ``QFormLayout`` 且字段列不做 stretch(呼应重构计划
第 2.2 节的「Section 卡片」约定,根治「占整行」)。
"""

from __future__ import annotations

from PySide6.QtWidgets import QFormLayout, QGroupBox, QVBoxLayout, QWidget


[文档] class SectionCard(QGroupBox): """带标题的内容卡片。 用法:: card = SectionCard("基本配置", icon="⚙️") card.add_field("工作表:", self.sheet_combo) card.content.addWidget(self.some_widget) """ def __init__(self, title: str = "", icon: str = "", parent: QWidget | None = None) -> None: super().__init__(parent) if icon: self.setTitle(f"{icon} {title}".strip()) elif title: self.setTitle(title) self._content = QVBoxLayout(self) self._content.setContentsMargins(12, 14, 12, 12) self._content.setSpacing(8) self._form: QFormLayout | None = None @property def content(self) -> QVBoxLayout: """返回内容主布局,调用方往里加控件/子布局。""" return self._content
[文档] def add_field(self, label: str, widget: QWidget) -> QWidget: """追加一行「标签 + 控件」,字段列按 sizeHint 定宽(不拉伸、不占整行)。""" if self._form is None: self._form = QFormLayout() self._form.setContentsMargins(0, 0, 0, 0) self._form.setFieldGrowthPolicy(QFormLayout.FieldGrowthPolicy.FieldsStayAtSizeHint) self._content.addLayout(self._form) self._form.addRow(label, widget) return widget
[文档] def add_widget(self, widget: QWidget) -> None: self._content.addWidget(widget)
[文档] def add_layout(self, layout: QVBoxLayout | QFormLayout) -> None: self._content.addLayout(layout)