다양한 스크롤 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개의 탭:
    1. 스크롤 영역(QScrollArea + QLabel)
    2. 리스트 스크롤(QListWidget)
    3. 로그 스크롤(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