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

PySide6에서 QWidget 내부 GroupBox 접근 및 조작 방법

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

PySide6에서 QWidget 내부 GroupBox 접근 및 조작 방법

PySide6에서 QWidget 내부에 여러 개의 QGroupBox를 추가하고 이를 접근하는 방법을 정리한 글입니다. QVBoxLayout을 사용하여 여러 개의 QGroupBox를 포함하는 QWidget을 구성한 후, 이를 딕셔너리에 저장하고 나중에 접근하는 방법을 설명합니다. 또한 layout.itemAt(i)None을 반환할 때 해결하는 방법까지 상세히 다룹니다.


1. QWidget 내부 GroupBox 접근 방법

1.1 딕셔너리에 QWidget을 저장하고 GroupBox를 추가하기

먼저, QWidget을 생성한 후 QVBoxLayout을 설정하고, 여러 개의 QGroupBox를 추가합니다. 이후, 이를 딕셔너리에 저장합니다.

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

class MyWidget(QWidget):
    def __init__(self):
        super().__init__()
        self.dicPeriGroup = {}
        peri_name = "Peripheral1"
        
        # QWidget 생성 및 레이아웃 설정
        self.dicPeriGroup[peri_name] = QWidget()
        layout = QVBoxLayout()
        self.dicPeriGroup[peri_name].setLayout(layout)
        
        # 여러 개의 GroupBox 추가
        for i in range(3):
            group_box = QGroupBox(f"GroupBox {i+1}")
            layout.addWidget(group_box)

2. QWidget 내부 모든 GroupBox 확인하기

저장된 QWidget 내부에 있는 QGroupBoxlayout()을 이용하여 탐색할 수 있습니다.

# GroupBox 확인하기
layout = self.dicPeriGroup[peri_name].layout()
item_count = layout.count()

for i in range(item_count):
    item = layout.itemAt(i)
    if item is not None:
        widget = item.widget()
        if isinstance(widget, QGroupBox):
            print(f"Found GroupBox {i+1}: {widget.title()}")
            widget.setVisible(True)  # 보이게 설정 가능
    else:
        print(f"Item at index {i} is None.")

3. layout.itemAt(i)의 위젯 타입 확인하기

PySide6에서 layout.itemAt(i).widget()이 어떤 타입인지 확인하려면 type() 함수를 사용할 수 있습니다.

for i in range(layout.count()):
    item = layout.itemAt(i)
    if item is not None:
        widget = item.widget()
        if widget:
            print(f"Item at index {i} is of type: {type(widget).__name__}")
        else:
            print(f"No widget found at index {i}.")
반응형

4. layout.itemAt(i)가 None을 반환할 때 내부 위젯 접근 방법

때때로 layout.itemAt(i)None을 반환할 수 있습니다. 이 문제를 해결하려면 다음 사항을 점검해야 합니다.

4.1 None이 나오는 원인

  • 위젯이 올바르게 추가되지 않았을 가능성
  • 해당 인덱스가 잘못되었거나 layout.count()보다 큰 값일 가능성
  • QSpacerItem이 추가된 경우 widget()None을 반환함

4.2 해결 방법

for i in range(layout.count()):
    item = layout.itemAt(i)
    if item is not None:
        if item.spacerItem():
            print(f"Item at index {i} is a spacer item.")
        elif item.layout():
            print(f"Item at index {i} is another layout.")
        elif item.widget():
            widget = item.widget()
            print(f"Item at index {i} is a widget of type: {type(widget).__name__}")
        else:
            print(f"Item at index {i} is unknown.")
    else:
        print(f"Item at index {i} is None.")

5. SpacerItem을 숨기는 방법

레이아웃에서 QSpacerItem을 숨기는 가장 좋은 방법은 해당 SpacerItem을 제거하는 것입니다.

for i in range(layout.count()):
    item = layout.itemAt(i)
    if item is not None and item.spacerItem():
        layout.removeItem(item)  # SpacerItem 제거

 

필요할 때 다시 추가하려면:

layout.addSpacerItem(QSpacerItem(20, 40))

6. findChildren을 이용한 GroupBox 접근

findChildren(QGroupBox)를 사용하면 해당 위젯 내부의 모든 QGroupBox를 가져올 수 있습니다.

# QWidget 내부 모든 GroupBox 찾기
all_group_boxes = self.dicPeriGroup[peri_name].findChildren(QGroupBox)

for gb in all_group_boxes:
    print(f"Found GroupBox: {gb.title()}")
    gb.setVisible(True)  # 보이게 설정

정리 (표 정리)

기능 사용 방법
QWidget 내부 GroupBox 접근 self.dicPeriGroup[peri_name].layout() 활용
GroupBox 확인하기 layout.itemAt(i).widget() 사용
위젯 타입 확인 type(widget).__name__ 이용
None 반환 문제 해결 spacerItem(), layout(), widget() 체크
SpacerItem 숨기기 layout.removeItem(spacer) 활용
findChildren 활용 findChildren(QGroupBox)로 모든 GroupBox 찾기
 
반응형