PYTHON GUI

[ Pyside6 ] QStandardItemModel로 데이터 테이블 쉽게 만들기

나루하루001 2025. 5. 26. 23:08
반응형



QStandardItemModel이란?


PySide를 처음 접하는 분들에게 QStandardItemModel은 다소 생소할 수 있습니다.

 

간단히 말해, QStandardItemModel은

데이터를 담는 그릇이라고 생각하면 됩니다.

 

이 그릇에 담긴 데이터는 테이블, 리스트, 트리 등 다양한 형태로 화면에 표시할 수 있습니다.

 

QStandardItemModel의 주요 특징은 다음과 같습니다:

- 행과 열로 구성된 표 형태로 데이터를 저장합니다.

- 각 셀에는 텍스트뿐만 아니라 아이콘, 체크박스 등 다양한 형태의 데이터를 넣을 수 있습니다.

- 데이터의 정렬, 필터링 등 다양한 기능을 지원합니다.

- 사용자 정의 데이터 모델을 만들지 않고도 간편하게 데이터를 표시할 수 있습니다.

 

기본 사용법 알아보기


QStandardItemModel을 사용하는 기본적인 단계는 다음과 같습니다:

 

1. 모델 생성하기

먼저 QStandardItemModel 객체를 생성합니다.

이때 행과 열의 크기를 지정할 수 있습니다.

from PySide6.QtGui import QStandardItemModel

# 4행 3열의 모델 생성
model = QStandardItemModel(4, 3)

# 크기를 지정하지 않고 생성한 후 나중에 설정할 수도 있습니다
model = QStandardItemModel()
model.setRowCount(4)
model.setColumnCount(3)

 

2. 헤더 설정하기

 

테이블의 열 이름(헤더)을 설정할 수 있습니다.

# 수평(열) 헤더 설정
model.setHorizontalHeaderLabels(["이름", "나이", "직업"])

# 수직(행) 헤더 설정
model.setVerticalHeaderLabels(["1번", "2번", "3번", "4번"])

 

3. 데이터 추가하기

 

모델에 데이터를 추가하는 방법은 여러 가지가 있습니다:

from PySide6.QtGui import QStandardItem

# 방법 1: setItem 메서드 사용
model.setItem(0, 0, QStandardItem("홍길동"))
model.setItem(0, 1, QStandardItem("25"))
model.setItem(0, 2, QStandardItem("개발자"))

# 방법 2: 아이템 생성 후 모델에 추가
name_item = QStandardItem("김철수")
age_item = QStandardItem("30")
job_item = QStandardItem("디자이너")

model.setItem(1, 0, name_item)
model.setItem(1, 1, age_item)
model.setItem(1, 2, job_item)

 

4. 뷰에 모델 연결하기

 

만든 모델을 뷰(View)에 연결하여 화면에 표시합니다.

from PySide6.QtWidgets import QTableView

# 테이블 뷰 생성
table_view = QTableView()

# 뷰에 모델 설정
table_view.setModel(model)

 

QStandardItem으로 데이터 관리하기


QStandardItemModel은

QStandardItem 객체를 사용하여 데이터를 저장합니다.

 

QStandardItem은 다양한 기능을 제공하여 데이터를 더 풍부하게 표현할 수 있습니다.

 

QStandardItem의 주요 기능

from PySide6.QtGui import QStandardItem, QIcon, QBrush, QColor
from PySide6.QtCore import Qt

# 텍스트 설정
item = QStandardItem("텍스트")

# 아이콘 설정
item.setIcon(QIcon("icon.png"))

# 체크박스 설정
item.setCheckable(True)
item.setCheckState(Qt.CheckState.Checked)

# 편집 가능 여부 설정
item.setEditable(False)

# 배경색 설정
item.setBackground(QBrush(QColor(200, 230, 255)))

# 글자색 설정
item.setForeground(QBrush(QColor(0, 0, 255)))

# 툴팁 설정
item.setToolTip("이것은 툴팁입니다")

# 정렬 설정
item.setTextAlignment(Qt.AlignmentFlag.AlignCenter)

# 사용자 정의 데이터 저장
item.setData("사용자 데이터", Qt.ItemDataRole.UserRole)
💡 알아두세요!
QStandardItem은 단순히 텍스트만 표시하는 것이 아니라, 아이콘, 체크박스, 색상 등 다양한 시각적 요소를 추가할 수 있습니다. 이를 활용하면 사용자에게 더 풍부한 정보를 제공할 수 있습니다.

 

반응형

다양한 뷰와 함께 사용하기


QStandardItemModel은 다양한 뷰 위젯과 함께 사용할 수 있습니다.

각 뷰는 같은 모델의 데이터를 다른 방식으로 표현합니다.

 

QTableView (테이블 뷰)

 

데이터를 행과 열의 그리드 형태로 표시합니다.

from PySide6.QtWidgets import QTableView

table_view = QTableView()
table_view.setModel(model)

# 열 너비 조정
table_view.setColumnWidth(0, 150)
table_view.setColumnWidth(1, 80)

# 행 높이 조정
table_view.setRowHeight(0, 40)

# 그리드 라인 표시 설정
table_view.setShowGrid(True)

# 열 이동 허용
table_view.setDragEnabled(True)
table_view.setAcceptDrops(True)
table_view.setDragDropOverwriteMode(False)

 

QListView (리스트 뷰)

 

데이터를 목록 형태로 표시합니다.

from PySide6.QtWidgets import QListView

list_view = QListView()
list_view.setModel(model)

# 아이템 크기 설정
list_view.setIconSize(QSize(32, 32))

# 아이템 간격 설정
list_view.setSpacing(5)

# 흐름 방향 설정 (좌에서 우로)
list_view.setFlow(QListView.Flow.LeftToRight)

QTreeView (트리 뷰)

 

데이터를 계층적인 트리 구조로 표시합니다.

from PySide6.QtWidgets import QTreeView

tree_view = QTreeView()
tree_view.setModel(model)

# 헤더 숨기기
tree_view.setHeaderHidden(True)

# 루트 항목 확장
tree_view.expandAll()

# 애니메이션 효과 설정
tree_view.setAnimated(True)

 

실전 예제: 데이터 표시하기


이제 QStandardItemModel을 사용하여 실제 데이터를 표시하는 완전한 예제를 살펴보겠습니다.

 

학생 정보 테이블 만들기

import sys
from PySide6.QtWidgets import QApplication, QMainWindow, QTableView, QVBoxLayout, QWidget
from PySide6.QtGui import QStandardItemModel, QStandardItem, QColor, QBrush
from PySide6.QtCore import Qt

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("학생 정보 테이블")
        self.resize(600, 400)
        
        # 중앙 위젯 설정
        central_widget = QWidget()
        self.setCentralWidget(central_widget)
        layout = QVBoxLayout(central_widget)
        
        # 테이블 뷰 생성
        self.table_view = QTableView()
        layout.addWidget(self.table_view)
        
        # 모델 생성 및 데이터 추가
        self.create_model()
        
        # 뷰에 모델 설정
        self.table_view.setModel(self.model)
        
        # 열 너비 조정
        self.table_view.setColumnWidth(0, 100)
        self.table_view.setColumnWidth(1, 80)
        self.table_view.setColumnWidth(2, 120)
        self.table_view.setColumnWidth(3, 200)
        
    def create_model(self):
        # 모델 생성
        self.model = QStandardItemModel()
        
        # 헤더 설정
        self.model.setHorizontalHeaderLabels(["이름", "학년", "학과", "이메일"])
        
        # 학생 데이터
        students = [
            ["김철수", "1", "컴퓨터공학", "kim@example.com"],
            ["이영희", "2", "전자공학", "lee@example.com"],
            ["박민수", "3", "소프트웨어공학", "park@example.com"],
            ["정지원", "1", "정보통신공학", "jung@example.com"],
            ["최유진", "4", "인공지능학", "choi@example.com"]
        ]
        
        # 데이터 추가
        for row, student in enumerate(students):
            for col, value in enumerate(student):
                item = QStandardItem(value)
                
                # 학년에 따라 배경색 설정
                if col == 1:
                    if value == "1":
                        item.setBackground(QBrush(QColor(220, 255, 220)))
                    elif value == "4":
                        item.setBackground(QBrush(QColor(255, 220, 220)))
                
                # 가운데 정렬
                item.setTextAlignment(Qt.AlignmentFlag.AlignCenter)
                
                self.model.setItem(row, col, item)

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

 

실행 결과:

- 학생 이름, 학년, 학과, 이메일이 포함된 테이블이 표시됩니다.

- 1학년은 연한 녹색, 4학년은 연한 빨간색 배경으로 표시됩니다.

- 모든 텍스트는 셀 가운데에 정렬됩니다.

pandas DataFrame과 함께 활용하기


데이터 분석을 하다 보면 pandas DataFrame을 GUI에 표시해야 할 때가 있습니다.

QStandardItemModel을 사용하면 DataFrame의 데이터를 쉽게 테이블에 표시할 수 있습니다.

 

DataFrame을 QStandardItemModel로 변환하기

import pandas as pd
from PySide6.QtGui import QStandardItemModel, QStandardItem

def dataframe_to_model(df):
    """pandas DataFrame을 QStandardItemModel로 변환합니다."""
    # 모델 생성
    model = QStandardItemModel()
    
    # 헤더 설정
    model.setHorizontalHeaderLabels(df.columns)
    
    # 데이터 추가
    for row in range(len(df.index)):
        for col, column in enumerate(df.columns):
            value = str(df.iloc[row, col])
            item = QStandardItem(value)
            model.setItem(row, col, item)
    
    return model

# 사용 예시
df = pd.DataFrame({
    '이름': ['김철수', '이영희', '박민수'],
    '나이': [25, 30, 28],
    '직업': ['개발자', '디자이너', '마케터']
})

model = dataframe_to_model(df)
table_view.setModel(model)

 

데이터 필터링 및 정렬 기능 추가하기

from PySide6.QtCore import QSortFilterProxyModel
from PySide6.QtWidgets import QLineEdit

# 프록시 모델 생성
proxy_model = QSortFilterProxyModel()
proxy_model.setSourceModel(model)

# 테이블 뷰에 프록시 모델 설정
table_view.setModel(proxy_model)

# 정렬 활성화
table_view.setSortingEnabled(True)

# 필터링을 위한 검색창 추가
search_input = QLineEdit()
search_input.setPlaceholderText("검색어 입력...")
layout.insertWidget(0, search_input)

# 검색창 텍스트가 변경될 때 필터 적용
search_input.textChanged.connect(lambda text: proxy_model.setFilterFixedString(text))
🔍 활용 팁!
QSortFilterProxyModel을 사용하면 원본 데이터를 변경하지 않고도 데이터를 정렬하거나 필터링할 수 있습니다. 이는 대용량 데이터를 다룰 때 특히 유용합니다.

 

마치며


QStandardItemModel은 PySide에서 데이터를 표시하는 가장 간편하고 강력한 방법 중 하나입니다.

 

초보자도 쉽게 사용할 수 있으면서도, 다양한 기능을 통해 복잡한 데이터 표현이 가능합니다.

 

이 글에서 배운 내용을 정리하면:

1. QStandardItemModel은 데이터를 저장하고 구성하는 컨테이너 역할을 합니다.

2. QStandardItem을 사용하여 텍스트, 아이콘, 색상 등 다양한 형태의 데이터를 표현할 수 있습니다.

3. 테이블 뷰, 리스트 뷰, 트리 뷰 등 다양한 뷰에 모델을 연결하여 데이터를 표시할 수 있습니다.

4. pandas DataFrame과 함께 사용하면 데이터 분석 결과를 쉽게 시각화할 수 있습니다.

5. QSortFilterProxyModel을 활용하면 정렬과 필터링 기능을 쉽게 구현할 수 있습니다.

 

QStandardItemModel을 마스터하면

PySide로 더 풍부하고 인터랙티브한 GUI 애플리케이션을 개발할 수 있습니다.

[ 파이썬 관련 블로그 글 목록 ] 

파이썬(Python) 블로그 목록
반응형