| from PyQt5.QtWidgets import QWidget, QToolButton, QVBoxLayout | |
| from PyQt5.QtCore import Qt | |
| class CollapsibleBox(QWidget): | |
| """A simple collapsible container widget with a chevron arrow.""" | |
| def __init__(self, title: str = "", parent=None): | |
| super().__init__(parent) | |
| self.toggle = QToolButton(text=title, checkable=True, checked=True) | |
| self.toggle.setToolButtonStyle(Qt.ToolButtonTextBesideIcon) | |
| self.toggle.setArrowType(Qt.DownArrow) | |
| self.toggle.clicked.connect(self.on_toggled) | |
| self.toggle.setStyleSheet("QToolButton { border: none; font-weight:600; padding:6px; }") | |
| self.content = QWidget() | |
| self.content_layout = QVBoxLayout() | |
| self.content_layout.setContentsMargins(8, 4, 8, 8) | |
| self.content.setLayout(self.content_layout) | |
| lay = QVBoxLayout(self) | |
| lay.setSpacing(0) | |
| lay.setContentsMargins(0, 0, 0, 0) | |
| lay.addWidget(self.toggle) | |
| lay.addWidget(self.content) | |
| def on_toggled(self): | |
| checked = self.toggle.isChecked() | |
| self.toggle.setArrowType(Qt.DownArrow if checked else Qt.RightArrow) | |
| self.content.setVisible(checked) |