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_layout(self, layout: QVBoxLayout | QFormLayout) -> None:
self._content.addLayout(layout)