6.11 QScrollArea

다양한 스크롤 UI 위젯(QScrollArea, QListWidget, QTextEdit)을 사용해 보고,
이를 하나의 창에서 QTabWidget 으로 탭 구조로 통합해 보기
1. QScrollArea
더보기


# tab_scroll_area.py
from PySide6.QtWidgets import (
QWidget, QVBoxLayout, QScrollArea,
QLabel, QPushButton
)
from PySide6.QtCore import Qt
class ScrollAreaTab(QWidget):
def __init__(self, parent=None):
super().__init__(parent)
layout = QVBoxLayout(self)
self.add_button = QPushButton("항목 추가")
self.add_button.clicked.connect(self.add_item)
layout.addWidget(self.add_button)
self.scroll_area = QScrollArea()
self.scroll_area.setWidgetResizable(True)
layout.addWidget(self.scroll_area)
self.content_widget = QWidget()
self.content_layout = QVBoxLayout(self.content_widget)
self.content_layout.setAlignment(Qt.AlignTop)
self.scroll_area.setWidget(self.content_widget)
self.item_count = 0
for i in range(5):
self.add_label(f"초기 항목 {i + 1}")
self.item_count = 5
def add_label(self, text: str):
label = QLabel(text)
self.content_layout.addWidget(label)
def add_item(self):
self.item_count += 1
new_text = f"추가된 항목 {self.item_count}"
self.add_label(new_text)
print(new_text)
bar = self.scroll_area.verticalScrollBar()
bar.setValue(bar.maximum())
QScrollArea 사용
self.scroll_area = QScrollArea()
self.scroll_area.setWidgetResizable(True)
self.scroll_area.setWidget(self.content_widget)
스크롤 안에 실제 내용은 별도의 QWidget + QVBoxLayout
self.content_widget = QWidget()
self.content_layout = QVBoxLayout(self.content_widget)
내용이 많아지면 자동으로 스크롤바 생성
- setFixedSize(300, 300) 으로 창 크기 고정
- 그 안의 content_layout에 라벨들이 계속 추가되면서 스크롤 영역에 스크롤바가 생김
항목 추가 시 자동으로 맨 아래로 스크롤
bar = self.scroll_area.verticalScrollBar()
bar.setValue(bar.maximum())
2. QListWidget
더보기


# tab_list_widget.py
from PySide6.QtWidgets import (
QWidget, QVBoxLayout,
QPushButton, QListWidget
)
class ListWidgetTab(QWidget):
def __init__(self, parent=None):
super().__init__(parent)
layout = QVBoxLayout(self)
self.add_button = QPushButton("항목 추가")
self.add_button.clicked.connect(self.add_item)
layout.addWidget(self.add_button)
self.list_widget = QListWidget()
layout.addWidget(self.list_widget)
self.item_count = 0
for i in range(10):
self.list_widget.addItem(f"초기 항목 {i + 1}")
self.item_count = 10
def add_item(self):
self.item_count += 1
text = f"추가 항목 {self.item_count}"
self.list_widget.addItem(text)
print(text)
self.list_widget.scrollToBottom()
- 항목이 많아지면 QListWidget에서 자동으로 스크롤바 생성
- scrollToBottom() 으로 새 항목 추가 시 항상 맨 아래가 보이게 처리
3. QTextEdit
더보기


# tab_log_textedit.py
from PySide6.QtWidgets import (
QWidget, QVBoxLayout,
QPushButton, QTextEdit
)
from PySide6.QtGui import QTextCursor
class LogTextEditTab(QWidget):
def __init__(self, parent=None):
super().__init__(parent)
layout = QVBoxLayout(self)
self.log_textedit = QTextEdit()
self.log_textedit.setReadOnly(True)
layout.addWidget(self.log_textedit)
self.log_button = QPushButton("로그 추가")
self.log_button.clicked.connect(self.add_log)
layout.addWidget(self.log_button)
self.log_count = 0
def add_log(self):
self.log_count += 1
message = f"[로그] {self.log_count}번째 메시지입니다."
self.log_textedit.append(message)
print(message)
cursor = self.log_textedit.textCursor()
cursor.movePosition(QTextCursor.End)
self.log_textedit.setTextCursor(cursor)
self.log_textedit.ensureCursorVisible()
- setReadOnly(True)로 사용자가 편집하지 못하게 = 전형적인 로그창 스타일
- append()로 한 줄씩 추가
- QTextCursor를 사용해 항상 맨 아래 줄로 스크롤 이동
4. 추가 실습 과제
: 위 3가지 종류의 스크롤을 모두 통합된 한 창에 탭으로 묶어서(QTabWidget) 으로 구현하기
더보기


구조
scroll_tabs_demo/
├── main.py # 실행 진입점
├── main_window.py # QTabWidget 포함 메인 윈도우
├── tab_scroll_area.py # 1번 탭: QScrollArea + QLabel
├── tab_list_widget.py # 2번 탭: QListWidget
└── tab_log_textedit.py # 3번 탭: QTextEdit 로그창
- 한 창에 3개의 탭:
- 스크롤 영역(QScrollArea + QLabel)
- 리스트 스크롤(QListWidget)
- 로그 스크롤(QTextEdit)
- 각 탭은 별도 파일/클래스로 분리
- main_window.py에서 QTabWidget으로 모두 묶고
- main.py에서 QApplication을 실행
파일
main.py
0.00MB
widget.py
0.00MB
tab_log_textedit.py
0.00MB
tab_list_widget.py
0.00MB
tab_scroll_area.py
0.00MB