본문 바로가기
코딩취미/Python

PySide6에서 QGroupBox를 트리뷰처럼 활용하는 방법

by 브링블링 2025. 2. 24.
반응형

📌 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 구성
반응형