PYTHON GUI

[ PySide6 ] QTableWidget 메서드 기본 가이드: 테이블 위젯 기본기 익히기

나루하루001 2025. 5. 21. 23:14
반응형



QTableWidget 소개


PySide6의 QTableWidget은

데이터를 표 형식으로 표시하기 위한 강력한 위젯입니다.

 

이 위젯은 행과 열로 구성된 그리드에 데이터를 표시하며,

사용자가 쉽게 데이터를 조회하고 편집할 수 있는 인터페이스를 제공합니다.

 

QTableWidget은 기본 모델-뷰 아키텍처를 기반으로 하지만,

간단한 테이블 표시에 최적화된 편리한 클래스입니다.

 

복잡한 데이터 모델이 필요한 경우에는

QTableView를 사용하는 것이 좋습니다.

 

QTableWidget의 각 셀은 QTableWidgetItem 객체로 표현되며,

이를 통해 텍스트, 아이콘, 체크박스 등 다양한 유형의 데이터를 표시할 수 있습니다.

 

이 포스팅에서는 예제 코드에서 사용된 주요 QTableWidget 메서드들을 자세히 살펴보겠습니다.

 

기본 테이블 설정 메서드

 

테이블 크기 설정하기

 

QTableWidget을 사용할 때 가장 먼저 해야 할 일은

테이블의 크기(행과 열의 수)를 설정하는 것입니다.

 

다음 메서드들을 사용하여 테이블의 기본 구조를 정의할 수 있습니다.

# 열 개수 설정
tableWidget.setColumnCount(5)  # 5개 열 생성

# 행 개수 설정
tableWidget.setRowCount(20)    # 20개 행 생성

# 현재 행/열 개수 확인
column_count = tableWidget.columnCount()
row_count = tableWidget.rowCount()
💡 TIP: 테이블 크기는 나중에 동적으로 변경할 수 있습니다. 예를 들어, 데이터가 추가되면 insertRow() 메서드를 사용하여 새 행을 추가할 수 있습니다.

 

열 헤더 설정하기

 

테이블의 열 헤더는 각 열에 대한 설명을 제공합니다.

 

setHorizontalHeaderLabels() 메서드를 사용하여 열 헤더의 텍스트를 설정할 수 있습니다.

# 열 헤더 설정
headers = ["이름", "나이", "성별", "직업", "점수"]
tableWidget.setHorizontalHeaderLabels(headers)

# 개별 열 헤더 설정
tableWidget.setHorizontalHeaderItem(0, QTableWidgetItem("이름"))

 

마찬가지로 행 헤더도 설정할 수 있습니다:

# 행 헤더 설정
row_headers = ["행1", "행2", "행3"]
tableWidget.setVerticalHeaderLabels(row_headers)

 

QTableWidgetItem 다루기

 

아이템 생성 및 설정

 

QTableWidget의 각 셀은

QTableWidgetItem 객체로 표현됩니다. 이 객체를 생성하고 테이블에 추가하는 방법은 다음과 같습니다.

# 아이템 생성
name_item = QTableWidgetItem("김철수")

# 아이템을 테이블에 설정 (행, 열, 아이템)
tableWidget.setItem(0, 0, name_item)

# 아이템 텍스트 직접 설정
age_item = QTableWidgetItem(str(25))
tableWidget.setItem(0, 1, age_item)

 

아이템 속성 설정

 

QTableWidgetItem에는 다양한 속성을 설정할 수 있습니다.

텍스트 정렬, 배경색, 글꼴 등을 변경하여 테이블의 시각적 표현을 향상시킬 수 있습니다.

from PySide6.QtCore import Qt
from PySide6.QtGui import QColor, QFont, QBrush

# 아이템 생성
item = QTableWidgetItem("테스트")

# 텍스트 정렬 설정
item.setTextAlignment(Qt.AlignCenter)

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

# 글꼴 설정
font = QFont()
font.setBold(True)
item.setFont(font)

# 아이템 편집 가능 여부 설정
item.setFlags(item.flags() & ~Qt.ItemIsEditable)  # 편집 불가능하게 설정

# 아이템을 테이블에 추가
tableWidget.setItem(0, 0, item)
💡 TIP: QTableWidgetItem은 텍스트 외에도 아이콘, 체크박스 등을 표시할 수 있습니다. setIcon() 메서드를 사용하여 아이콘을 추가하거나, setCheckState()를 사용하여 체크박스를 표시할 수 있습니다.

 

반응형

헤더(QHeaderView) 관련 메서드


QTableWidget의 헤더는 QHeaderView 클래스로 관리됩니다.

 

horizontalHeader()와 verticalHeader() 메서드를 통해 헤더 객체에 접근할 수 있습니다.

 

헤더 크기 조절 모드

 

예제 코드에서 사용된 중요한 메서드 중 하나는 setSectionResizeMode()입니다.

이 메서드는 헤더 섹션(열 또는 행)의 크기 조절 방식을 설정합니다.

# 모든 열을 Stretch 모드로 설정하여 테이블 너비에 맞게 자동 조절
tableWidget.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)

# 행 높이 자동 조절
tableWidget.verticalHeader().setSectionResizeMode(QHeaderView.ResizeToContents)

# 특정 열만 크기 조절 모드 설정
tableWidget.horizontalHeader().setSectionResizeMode(0, QHeaderView.Fixed)  # 첫 번째 열은 고정 크기
tableWidget.horizontalHeader().setSectionResizeMode(1, QHeaderView.Stretch)  # 두 번째 열은 늘림 모드

 

QHeaderView에서 사용할 수 있는 주요 크기 조절 모드는 다음과 같습니다:

1. QHeaderView.Interactive: 사용자가 마우스로 크기를 조절할 수 있습니다.

2. QHeaderView.Stretch: 사용 가능한 공간을 채우도록 섹션 크기가 조정됩니다.

3. QHeaderView.ResizeToContents: 내용에 맞게 섹션 크기가 자동으로 조정됩니다.

4. QHeaderView.Fixed: 사용자가 섹션 크기를 변경할 수 없습니다.

 

헤더 스타일 및 동작 설정

 

헤더의 시각적 스타일과 동작을 사용자 지정할 수 있는 다양한 메서드가 있습니다.

# 헤더 표시/숨김 설정
tableWidget.horizontalHeader().setVisible(True)  # 열 헤더 표시
tableWidget.verticalHeader().setVisible(False)   # 행 헤더 숨김

# 헤더 높이/너비 설정
tableWidget.horizontalHeader().setDefaultSectionSize(100)  # 기본 열 너비
tableWidget.verticalHeader().setDefaultSectionSize(30)     # 기본 행 높이

# 특정 열의 너비 설정
tableWidget.horizontalHeader().resizeSection(0, 150)  # 첫 번째 열 너비를 150픽셀로 설정

# 헤더 정렬 설정
tableWidget.horizontalHeader().setDefaultAlignment(Qt.AlignLeft)  # 기본 정렬을 왼쪽으로

 

선택 및 검색 메서드

 

아이템 선택 관련 메서드

 

QTableWidget에서는 다양한 방법으로 아이템을 선택하고 선택된 아이템을 관리할 수 있습니다.

# 선택 모드 설정
tableWidget.setSelectionMode(QAbstractItemView.SingleSelection)  # 단일 선택
tableWidget.setSelectionMode(QAbstractItemView.MultiSelection)   # 다중 선택
tableWidget.setSelectionMode(QAbstractItemView.ExtendedSelection)  # 확장 선택

# 선택 동작 설정
tableWidget.setSelectionBehavior(QAbstractItemView.SelectItems)    # 개별 아이템 선택
tableWidget.setSelectionBehavior(QAbstractItemView.SelectRows)     # 행 단위 선택
tableWidget.setSelectionBehavior(QAbstractItemView.SelectColumns)  # 열 단위 선택

# 프로그래밍 방식으로 아이템 선택
tableWidget.selectRow(3)       # 4번째 행 선택
tableWidget.selectColumn(2)    # 3번째 열 선택
tableWidget.setCurrentCell(1, 2)  # 특정 셀 선택 (2행 3열)

# 선택된 아이템 가져오기
selected_items = tableWidget.selectedItems()  # 선택된 모든 아이템 목록
current_item = tableWidget.currentItem()      # 현재 선택된 아이템
current_row = tableWidget.currentRow()        # 현재 선택된 행
current_column = tableWidget.currentColumn()  # 현재 선택된 열

 

아이템 검색 메서드

 

테이블에서 특정 텍스트를 검색하려면 findItems() 메서드를 사용할 수 있습니다.

from PySide6.QtCore import Qt

# 특정 텍스트를 포함하는 아이템 검색
items = tableWidget.findItems("김철수", Qt.MatchExactly)  # 정확히 일치하는 항목 검색
items = tableWidget.findItems("김", Qt.MatchContains)     # 포함하는 항목 검색
items = tableWidget.findItems("김.*", Qt.MatchRegExp)     # 정규식으로 검색

# 검색 결과 처리
if items:
    for item in items:
        row = item.row()
        column = item.column()
        print(f"찾은 아이템: ({row}, {column}) - {item.text()}")
        
        # 찾은 아이템 선택
        tableWidget.setCurrentItem(item)
💡 TIP: findItems() 메서드는 Qt.MatchFlag를 사용하여 다양한 검색 방식을 지원합니다. 주요 플래그로는 Qt.MatchExactly(정확히 일치), Qt.MatchContains(포함), Qt.MatchStartsWith(시작 문자열 일치), Qt.MatchEndsWith(끝 문자열 일치), Qt.MatchRegExp(정규식) 등이 있습니다.

 

실전 예제: 테이블 위젯 구현하기


다음은 예제 코드를 기반으로 QTableWidget을 사용하는 방법을 종합적으로 보여주는 예제입니다.

import sys
import random
from PySide6.QtWidgets import (QApplication, QMainWindow, QTableWidgetItem, 
                             QHeaderView, QAbstractItemView)
from PySide6.QtCore import Qt
from PySide6.QtGui import QColor, QBrush

class TableExample(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("QTableWidget 예제")
        self.setGeometry(100, 100, 800, 600)
        
        # 테이블 위젯 생성
        self.table = QTableWidget(self)
        self.setCentralWidget(self.table)
        
        # 테이블 설정
        self.setupTable()
        
        # 데이터 추가
        self.populateTable()
        
        # 테이블 크기 및 스타일 설정
        self.setupTableAppearance()
        
    def setupTable(self):
        # 기본 테이블 구조 설정
        self.table.setColumnCount(5)
        self.table.setRowCount(0)  # 초기에는 행 없음
        
        # 열 헤더 설정
        headers = ["이름", "나이", "성별", "직업", "점수"]
        self.table.setHorizontalHeaderLabels(headers)
        
        # 선택 모드 설정
        self.table.setSelectionBehavior(QAbstractItemView.SelectRows)  # 행 단위 선택
        self.table.setSelectionMode(QAbstractItemView.SingleSelection)  # 단일 선택
        
        # 편집 모드 설정
        self.table.setEditTriggers(QAbstractItemView.DoubleClicked | 
                                  QAbstractItemView.EditKeyPressed)
    
    def populateTable(self):
        # 샘플 데이터
        names = ["김철수", "이영희", "박지민", "최수진", "정민준"]
        genders = ["남성", "여성"]
        jobs = ["회사원", "학생", "교사", "의사", "엔지니어"]
        
        # 데이터 추가
        for i in range(5):
            # 새 행 추가
            row_position = self.table.rowCount()
            self.table.insertRow(row_position)
            
            # 이름 설정
            name_item = QTableWidgetItem(names[i])
            name_item.setTextAlignment(Qt.AlignCenter)
            self.table.setItem(row_position, 0, name_item)
            
            # 나이 설정 (20~60)
            age = random.randint(20, 60)
            age_item = QTableWidgetItem(str(age))
            age_item.setTextAlignment(Qt.AlignCenter)
            self.table.setItem(row_position, 1, age_item)
            
            # 성별 설정
            gender = random.choice(genders)
            gender_item = QTableWidgetItem(gender)
            gender_item.setTextAlignment(Qt.AlignCenter)
            # 성별에 따라 배경색 변경
            if gender == "남성":
                gender_item.setBackground(QBrush(QColor(200, 220, 255)))
            else:
                gender_item.setBackground(QBrush(QColor(255, 200, 220)))
            self.table.setItem(row_position, 2, gender_item)
            
            # 직업 설정
            job_item = QTableWidgetItem(random.choice(jobs))
            job_item.setTextAlignment(Qt.AlignCenter)
            self.table.setItem(row_position, 3, job_item)
            
            # 점수 설정 (0~100)
            score = random.randint(0, 100)
            score_item = QTableWidgetItem(str(score))
            score_item.setTextAlignment(Qt.AlignCenter)
            # 점수에 따라 배경색 변경
            if score >= 80:
                score_item.setBackground(QBrush(QColor(200, 255, 200)))  # 높은 점수는 녹색
            elif score < 60:
                score_item.setBackground(QBrush(QColor(255, 200, 200)))  # 낮은 점수는 빨간색
            self.table.setItem(row_position, 4, score_item)
    
    def setupTableAppearance(self):
        # 열 너비 자동 조절
        self.table.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
        
        # 행 높이 설정
        self.table.verticalHeader().setDefaultSectionSize(40)
        
        # 격자선 스타일 설정
        self.table.setShowGrid(True)
        self.table.setGridStyle(Qt.SolidLine)
        
        # 헤더 스타일 설정
        header = self.table.horizontalHeader()
        header.setStyleSheet("QHeaderView::section { background-color: #4a6ea9; color: white; padding: 6px; }")
        
        # 행 번호 숨기기
        self.table.verticalHeader().setVisible(False)
        
        # 테이블 크기 정책 설정
        self.table.setSizeAdjustPolicy(QAbstractItemView.AdjustToContents)

# 애플리케이션 실행
if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = TableExample()
    window.show()
    sys.exit(app.exec())
💡 TIP: QTableWidget은 데이터를 표시하는 것 외에도 다양한 시각적 효과와 사용자 상호작용을 지원합니다. 셀에 위젯을 삽입하거나, 셀 병합, 정렬 기능 등을 구현하여 더 풍부한 사용자 경험을 제공할 수 있습니다.

결론

 

PySide6의 QTableWidget은

데이터를 표 형식으로 표시하기 위한 강력하고 유연한 위젯입니다.

 

이 포스팅에서는 QTableWidget의 주요 메서드를 살펴보고,

테이블 생성부터 스타일링, 데이터 관리까지 다양한 기능을 알아보았습니다.

 

QTableWidget은 간단한 데이터 표시에 적합하며,

더 복잡한 데이터 모델이 필요한 경우에는

QTableView와 사용자 정의 모델을 고려해볼 수 있습니다.

 

테이블 위젯의 다양한 메서드를 활용하면 사용자 친화적인 데이터 표시 인터페이스를 쉽게 구현할 수 있습니다.

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

파이썬(Python) 블로그 목록




반응형