반응형
📌 PySide6에서 QGroupBox를 트리뷰처럼 활용하는 방법
PySide6에서 QGroupBox를 사용하여 UI를 트리뷰처럼 구성하는 방법을 살펴보겠습니다. 트리뷰 스타일의 QGroupBox를 생성하고, 체크박스를 사용하여 접힘/펼침 기능을 구현하며, QTreeView에서 특정 열에 QComboBox를 추가하는 방법을 포함합니다. 또한, 그룹박스 안의 항목을 추가하고 구분선을 그리는 방법과, QVBoxLayout에서 공백을 제거하는 방법도 함께 다룹니다.
✅ 1. 개요
- QGroupBox를 트리뷰처럼 활용: 그룹박스를 중첩하여 트리 구조처럼 보이게 구현
- 체크박스로 펼침/접힘 기능 추가: 체크하면 내부 내용이 보이고, 체크 해제하면 접힘
- QTreeView의 특정 열에 QComboBox 삽입: 콤보박스를 추가하고 이벤트 처리
- 그룹박스 내 항목을 구분선으로 나누기: QFrame을 활용하여 항목 사이에 선을 추가
- QVBoxLayout의 공백 제거: setSpacing(0), setContentsMargins(0,0,0,0) 설정
📌 2. 주요 기능 정리
기능 | 설명 |
QGroupBox 트리뷰 스타일 | 그룹박스를 중첩하여 트리뷰처럼 표현 |
체크박스 활용 | 체크 시 그룹박스 내용을 표시, 해제 시 접기 |
QTreeView에서 QComboBox 추가 | 특정 열에 콤보박스를 삽입하고 이벤트 처리 |
항목 구분선 추가 | QFrame을 활용하여 그룹박스 내 항목을 구분 |
레이아웃 공백 제거 | setSpacing(0), setContentsMargins(0,0,0,0) 설정 |
✍ 3. 예제 코드
아래 코드는 PySide6을 사용하여 QGroupBox를 트리뷰 스타일로 구성하고, 체크박스를 활용하여 접기/펼치기 기능을 추가하는 방법을 보여줍니다. 또한 QTreeView에 QComboBox를 삽입하고 이벤트를 처리하며, 항목 간 구분선을 추가하고, 레이아웃의 공백을 제거합니다.
import sys
from PySide6.QtWidgets import (QApplication, QMainWindow, QVBoxLayout, QWidget,
QGroupBox, QCheckBox, QLabel, QTreeView, QStandardItemModel,
QStandardItem, QComboBox, QHBoxLayout, QFrame)
from PySide6.QtCore import Qt
class CustomTreeView(QTreeView):
def __init__(self):
super().__init__()
# QTreeView 모델 설정
self.model = QStandardItemModel()
self.model.setHorizontalHeaderLabels(["Name", "Type"])
# 부모 항목 추가
parent_item = QStandardItem("Root Item")
self.model.appendRow(parent_item)
# 자식 항목 추가
child_item = QStandardItem("Child Item")
parent_item.appendRow([child_item, QStandardItem("Select Type")])
self.setModel(self.model)
# 특정 열에 콤보박스 추가
self.setItemDelegateForColumn(1, ComboBoxDelegate(self))
class ComboBoxDelegate(QComboBox):
def __init__(self, parent=None):
super().__init__(parent)
self.addItems(["Option 1", "Option 2", "Option 3"])
self.currentIndexChanged.connect(self.on_combobox_change)
def on_combobox_change(self, index):
print(f"ComboBox changed to {self.itemText(index)}")
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("QGroupBox as TreeView")
# 메인 위젯 설정
container = QWidget()
self.setCentralWidget(container)
main_layout = QVBoxLayout(container)
main_layout.setSpacing(0) # 레이아웃 간격 제거
main_layout.setContentsMargins(0, 0, 0, 0) # 여백 제거
# 트리뷰 스타일 그룹박스
self.groupbox = QGroupBox("Main GroupBox")
self.groupbox_layout = QVBoxLayout(self.groupbox)
self.groupbox_layout.setSpacing(0)
# 체크박스 추가 (펼침/접힘 기능)
self.checkbox = QCheckBox("Expand")
self.checkbox.setChecked(True)
self.checkbox.stateChanged.connect(self.toggle_groupbox)
self.groupbox_layout.addWidget(self.checkbox)
# 내부 그룹박스 (트리뷰처럼 보이도록)
self.inner_groupbox = QGroupBox("Inner GroupBox")
self.inner_groupbox_layout = QVBoxLayout(self.inner_groupbox)
self.inner_groupbox_layout.setSpacing(0)
# 그룹박스 내부 항목 추가
for i in range(3):
label = QLabel(f"Item {i+1}")
self.inner_groupbox_layout.addWidget(label)
# 구분선 추가
line = QFrame()
line.setFrameShape(QFrame.HLine)
line.setFrameShadow(QFrame.Sunken)
self.inner_groupbox_layout.addWidget(line)
self.groupbox_layout.addWidget(self.inner_groupbox)
# 트리뷰 추가
self.tree_view = CustomTreeView()
main_layout.addWidget(self.groupbox)
main_layout.addWidget(self.tree_view)
def toggle_groupbox(self, state):
"""체크박스 선택 시 그룹박스 내용 보이기/숨기기"""
self.inner_groupbox.setVisible(state == Qt.Checked)
if __name__ == "__main__":
app = QApplication(sys.argv)
window = MainWindow()
window.show()
app.exec()
반응형
📌 4. 코드 설명
✔ QGroupBox를 트리뷰처럼 표현
- QGroupBox를 중첩하여 트리 형태로 구성
- QCheckBox를 추가하여 클릭 시 펼침/접힘 기능 구현 (toggle_groupbox 함수)
✔ QTreeView에서 특정 열에 QComboBox 추가
- QStandardItemModel을 활용하여 QTreeView에 데이터를 삽입
- ComboBoxDelegate 클래스를 만들어 특정 열에 QComboBox 추가
- currentIndexChanged 시그널을 연결하여 콤보박스 변경 시 이벤트 처리
✔ 그룹박스 내부 항목 구분선 추가
- QFrame()을 활용하여 HLine 형태의 구분선을 추가
- setFrameShape(QFrame.HLine) 및 setFrameShadow(QFrame.Sunken) 설정
✔ QVBoxLayout의 공백 제거
- setSpacing(0)을 설정하여 위젯 간 간격을 제거
- setContentsMargins(0, 0, 0, 0)으로 레이아웃의 여백 제거
🔹 5. 실행 결과
- 체크박스를 클릭하면 그룹박스의 내용이 펼쳐짐/접힘
- QTreeView의 특정 열에 QComboBox가 추가되어 동작
- QGroupBox 내부에 항목을 추가하고 구분선으로 나눔
- 레이아웃의 공백이 제거되어 자연스러운 UI 구성
반응형
'코딩취미 > Python' 카테고리의 다른 글
파이썬에서 지정된 자리수로 숫자 표시하기 (0) | 2025.02.24 |
---|---|
PyQt6에서 QScrollArea 사용법: QWidget에 ScrollArea 설정하고 그룹박스 활용하기 (0) | 2025.02.24 |
PySide6에서 findChildren()을 활용하는 방법 (0) | 2025.02.23 |
PySide6에서 QWidget 내부 GroupBox 접근 및 조작 방법 (0) | 2025.02.23 |
IntelHex Python 모듈을 활용한 HEX & BIN 파일 검증 방법 (0) | 2025.02.23 |