반응형
📌 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)을 사용하여 여백 추가 |
반응형
'코딩취미 > Python' 카테고리의 다른 글
[Python & PySide6] Slot을 사용하는 이유와 Slot 데코레이터의 차이점 (0) | 2025.02.25 |
---|---|
파이썬에서 지정된 자리수로 숫자 표시하기 (0) | 2025.02.24 |
PySide6에서 QGroupBox를 트리뷰처럼 활용하는 방법 (0) | 2025.02.24 |
PySide6에서 findChildren()을 활용하는 방법 (0) | 2025.02.23 |
PySide6에서 QWidget 내부 GroupBox 접근 및 조작 방법 (0) | 2025.02.23 |