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

PySide6에서 findChildren()을 활용하는 방법

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

PySide6에서 findChildren()을 활용하는 방법

PySide6에서 findChildren() 메서드는 특정 타입의 모든 자식 위젯을 검색할 때 유용합니다. QWidget 내부의 QGroupBox, QPushButton, QLineEdit 등의 자식 위젯을 찾아야 할 때 layout.itemAt()을 사용하는 것보다 간단하고 직관적인 방법을 제공합니다. 이 글에서는 findChildren()을 활용하여 특정 위젯을 찾고 조작하는 방법을 예제 코드와 함께 설명합니다.


1. findChildren() 기본 개념

findChildren() 메서드는 QWidget의 모든 자식 위젯을 검색하는 기능을 제공합니다.

사용법:

widget.findChildren(QWidgetType, name="optional_name")
  • QWidgetType: 찾고자 하는 위젯의 클래스 타입 (QGroupBox, QPushButton 등)
  • name (선택 사항): 특정 이름을 가진 위젯만 찾고 싶을 때 사용

2. findChildren()을 사용하여 모든 특정 위젯 찾기

예제 1: 특정 타입의 모든 자식 위젯 찾기

아래 코드는 QWidget 내부에 있는 모든 QGroupBox를 검색하는 예제입니다.

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

class MyWidget(QWidget):
    def __init__(self):
        super().__init__()
        layout = QVBoxLayout()
        self.setLayout(layout)
        
        # 여러 개의 GroupBox 추가
        for i in range(3):
            group_box = QGroupBox(f"GroupBox {i+1}")
            layout.addWidget(group_box)
        
        # 모든 QGroupBox 찾기
        group_boxes = self.findChildren(QGroupBox)
        for i, box in enumerate(group_boxes):
            print(f"Found GroupBox {i+1}: {box.title()}")

3. 특정 이름을 가진 위젯 찾기

findChildren()name 매개변수를 사용하면 특정 이름을 가진 위젯만 검색할 수 있습니다.

예제 2: 특정 이름을 가진 QGroupBox 찾기

# GroupBox 추가
group_box1 = QGroupBox("Settings")
group_box1.setObjectName("settings_box")
layout.addWidget(group_box1)

# 특정 이름을 가진 QGroupBox 찾기
found_box = self.findChildren(QGroupBox, "settings_box")
if found_box:
    print(f"Found named GroupBox: {found_box[0].title()}")

4. findChildren()을 사용하여 여러 타입의 위젯 찾기

한 번에 여러 개의 다른 타입의 위젯을 찾을 수도 있습니다.

예제 3: 여러 위젯 타입 검색

from PySide6.QtWidgets import QPushButton, QLineEdit

# 버튼과 입력 필드 추가
btn = QPushButton("Click Me")
btn.setObjectName("main_button")
layout.addWidget(btn)

line_edit = QLineEdit()
line_edit.setObjectName("input_field")
layout.addWidget(line_edit)

# QPushButton과 QLineEdit 찾기
buttons = self.findChildren(QPushButton)
line_edits = self.findChildren(QLineEdit)

print(f"Found {len(buttons)} buttons and {len(line_edits)} line edits.")

5. findChildren()findChild() 차이점

메서드설명

findChildren(type) 특정 타입의 모든 자식 위젯을 리스트로 반환
findChild(type, name) 특정 이름을 가진 단일 위젯을 반환 (없으면 None)

예제 4: findChild() 사용 예

# 특정 이름을 가진 QPushButton 찾기
button = self.findChild(QPushButton, "main_button")
if button:
    print("Button found!", button.text())

정리

기능 사용 방법
특정 타입의 모든 위젯 찾기 findChildren(QGroupBox)
특정 이름을 가진 위젯 찾기 findChildren(QGroupBox, "settings_box")
여러 위젯 타입 검색 findChildren(QPushButton), findChildren(QLineEdit)
단일 위젯 찾기 findChild(QPushButton, "main_button")

결론

PySide6에서 findChildren()을 활용하면 복잡한 UI 내에서 특정 위젯을 쉽게 찾고 조작할 수 있습니다. layout.itemAt()을 이용한 방법보다 간결하고 직관적인 코드 작성이 가능하며, 특정 이름을 활용한 세밀한 검색도 가능합니다.

반응형