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

PyQt6에서 QScrollArea 사용법: QWidget에 ScrollArea 설정하고 그룹박스 활용하기

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

📌 PyQt6에서 QScrollArea 사용법: QWidget에 ScrollArea 설정하고 그룹박스 활용하기

📝 소개

PyQt6에서 QScrollArea는 내용이 QWidget보다 클 경우 스크롤을 지원하는 위젯입니다. 본 포스트에서는 QScrollArea를 QWidget 안에 포함하는 방법과, 그룹박스를 활용하여 내부 위젯을 관리하는 방법을 정리했습니다.


🏗 QScrollArea 기본 개념

항목 설명
QScrollArea 스크롤이 가능한 위젯 컨테이너
setWidget() QScrollArea에 포함할 위젯을 설정
setWidgetResizable(True) 포함된 위젯이 QScrollArea 크기에 맞춰 조정
QGroupBox 여러 개의 위젯을 묶어서 관리하는 컨테이너

📌 QScrollArea를 QWidget에 설정하는 방법

🔹 1. QScrollArea를 QWidget 안에 추가하기

가장 기본적인 방법으로, QScrollArea를 생성하고 QWidget에 추가하는 방법입니다.

import sys
from PyQt6.QtWidgets import QApplication, QWidget, QScrollArea, QVBoxLayout, QLabel

class MainWidget(QWidget):
    def __init__(self):
        super().__init__()

        # QScrollArea 생성
        scroll_area = QScrollArea(self)
        scroll_area.setWidgetResizable(True)  # 위젯 크기에 맞게 조정

        # 스크롤할 내용을 포함할 위젯
        content_widget = QWidget()
        layout = QVBoxLayout()

        # 여러 개의 라벨 추가
        for i in range(20):
            layout.addWidget(QLabel(f"Label {i+1}"))

        content_widget.setLayout(layout)
        scroll_area.setWidget(content_widget)  # QScrollArea에 위젯 설정

        # 메인 레이아웃
        main_layout = QVBoxLayout()
        main_layout.addWidget(scroll_area)
        self.setLayout(main_layout)

        self.setWindowTitle("QScrollArea Example")
        self.resize(300, 200)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWidget()
    window.show()
    sys.exit(app.exec())

설명

  • QScrollArea를 생성하고 setWidgetResizable(True)로 크기 조정 가능하도록 설정합니다.
  • QWidget에 여러 개의 QLabel을 추가하여 스크롤이 필요하도록 만듭니다.
  • setWidget(content_widget)을 사용하여 QScrollArea에 내용을 추가합니다.

🔹 2. QWidget 안에 QScrollArea 포함시키기

QScrollArea를 QWidget 내부에 포함하려면 QVBoxLayout을 활용하면 됩니다.

import sys
from PyQt6.QtWidgets import QApplication, QWidget, QScrollArea, QVBoxLayout, QLabel

app = QApplication(sys.argv)

# QWidget 생성
A = QWidget()

# QScrollArea 생성
scroll_area = QScrollArea()
scroll_area.setWidgetResizable(True)

# 스크롤할 위젯
content_widget = QWidget()
layout = QVBoxLayout()

# 여러 개의 라벨 추가
for i in range(15):
    layout.addWidget(QLabel(f"Item {i+1}"))

content_widget.setLayout(layout)
scroll_area.setWidget(content_widget)

# QWidget에 QScrollArea 추가
main_layout = QVBoxLayout(A)
main_layout.addWidget(scroll_area)

A.setLayout(main_layout)
A.setWindowTitle("QScrollArea Inside QWidget")
A.resize(300, 200)
A.show()

sys.exit(app.exec())

설명

  • A = QWidget()을 만든 후, 그 안에 QScrollArea를 추가합니다.
  • QVBoxLayout(A)를 사용하여 QWidget에 QScrollArea를 포함합니다.
  • 위젯 크기를 resize(300, 200)로 설정하여 UI가 적절하게 표시되도록 합니다.
반응형

🔹 3. QScrollArea 안의 그룹박스 텍스트 읽어오기

여러 개의 QGroupBox를 QScrollArea 내부에 추가하고, 특정 QGroupBox의 제목을 읽어오는 방법입니다.

import sys
from PyQt6.QtWidgets import QApplication, QWidget, QScrollArea, QVBoxLayout, QGroupBox, QLabel, QPushButton

class ScrollableWidget(QWidget):
    def __init__(self):
        super().__init__()
        self.layout = QVBoxLayout()

        for i in range(5):  # 그룹박스 5개 추가
            group_box = QGroupBox(f"Group Box {i+1}")
            inner_layout = QVBoxLayout()
            inner_layout.addWidget(QLabel(f"Content inside {group_box.title()}"))
            group_box.setLayout(inner_layout)
            self.layout.addWidget(group_box)

        self.setLayout(self.layout)

class MainWidget(QWidget):
    def __init__(self):
        super().__init__()

        # QScrollArea 생성
        self.scroll_area = QScrollArea(self)
        self.scroll_area.setWidgetResizable(True)

        # ScrollableWidget 추가
        self.scrollable_widget = ScrollableWidget()
        self.scroll_area.setWidget(self.scrollable_widget)

        # 버튼 추가 (3번째 그룹박스 제목 읽기)
        self.button = QPushButton("Read Group Box 3 Title")
        self.button.clicked.connect(self.read_groupbox_title)

        # 레이아웃 설정
        layout = QVBoxLayout()
        layout.addWidget(self.scroll_area)
        layout.addWidget(self.button)
        self.setLayout(layout)

        self.setWindowTitle("QScrollArea with GroupBox")
        self.resize(350, 300)

    def read_groupbox_title(self):
        # 3번째 그룹박스의 제목 가져오기
        third_groupbox = self.scrollable_widget.layout.itemAt(2).widget()
        print(f"Third GroupBox Title: {third_groupbox.title()}")

if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MainWidget()
    window.show()
    sys.exit(app.exec())

설명

  • ScrollableWidget 안에 5개의 QGroupBox를 추가합니다.
  • QVBoxLayout().itemAt(2).widget()을 사용하여 3번째 그룹박스를 찾아 제목을 가져옵니다.
  • 버튼 클릭 시 read_groupbox_title()이 실행되어 터미널에 제목이 출력됩니다.

🚀 정리 & 필요한 사항

QScrollArea 사용 시 주의할 점

  • setWidgetResizable(True)을 설정하여 크기 조정 가능하도록 합니다.
  • 가로 스크롤이 필요하지 않다면 setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)를 사용할 수 있습니다.
  • QVBoxLayout().itemAt(index).widget()을 이용해 내부 위젯을 동적으로 가져올 수 있습니다.

QScrollArea 활용 팁

기능 코드
가로 스크롤 제거 scroll_area.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
QScrollArea 테두리 변경 scroll_area.setStyleSheet("border: 2px solid red;")
내부 위젯 가운데 정렬 QHBoxLayout().addStretch(1)을 사용하여 여백 추가
반응형