본문 바로가기
코딩취미/Python

PySide6으로 QTableWidget 다중 헤더 설정하는 방법

by 브링블링 2025. 3. 20.
반응형

PySide6으로 QTableWidget 다중 헤더 설정하는 방법

PySide6를 사용하여 GUI 애플리케이션을 개발할 때, QTableWidget을 활용하면 데이터를 쉽게 표 형식으로 정리할 수 있습니다. 특히, 다중 헤더를 설정하면 데이터 구조를 더욱 직관적으로 정리할 수 있습니다. 이 글에서는 QTableWidget의 다중 헤더를 설정하는 다양한 방법과 관련 기능들을 설명하고, 예제 코드를 제공하겠습니다.


1. QTableWidget 기본 설정

QTableWidget을 사용하기 위해 기본적인 설정부터 시작합니다.

예제 코드: 기본 테이블 생성

from PySide6.QtWidgets import QApplication, QTableWidget, QTableWidgetItem, QVBoxLayout, QWidget
from PySide6.QtGui import QColor
import sys

class TableWidgetExample(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        layout = QVBoxLayout()
        
        self.table = QTableWidget(3, 3)  # 3행 3열 테이블 생성
        self.table.setHorizontalHeaderLabels(["이름", "나이", "직업"])
        
        data = [["홍길동", "25", "개발자"],
                ["김철수", "30", "디자이너"],
                ["이영희", "28", "마케터"]]
        
        for row, rowData in enumerate(data):
            for col, value in enumerate(rowData):
                item = QTableWidgetItem(value)
                if row % 2 == 0:
                    item.setBackground(QColor(240, 240, 240))  # 회색 배경 적용
                self.table.setItem(row, col, item)
        
        self.table.resizeColumnsToContents()
        self.table.resizeRowsToContents()
        
        layout.addWidget(self.table)
        self.setLayout(layout)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = TableWidgetExample()
    window.show()
    sys.exit(app.exec())
반응형

2. 다중 헤더 설정 방법

PySide6의 QTableWidget 자체적으로 다중 헤더를 지원하지 않기 때문에, QHeaderView를 활용하여 머리글을 병합하거나 QTreeWidget을 사용하여 계층적 구조를 만들 수 있습니다.

(1) QTableWidget에서 다중 헤더 시뮬레이션하기

기본적인 QTableWidget에서 다중 헤더를 표현하는 방법은 첫 번째 행을 머리글처럼 사용하는 것입니다.

from PySide6.QtWidgets import QApplication, QTableWidget, QTableWidgetItem, QVBoxLayout, QWidget
from PySide6.QtGui import QColor
import sys

class MultiHeaderTable(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        layout = QVBoxLayout()
        self.table = QTableWidget(4, 3)  # 4행 3열 테이블 생성
        
        # 다중 헤더 구현
        self.table.setSpan(0, 0, 1, 2)  # 첫 번째 행의 0~1열 병합
        self.table.setItem(0, 0, QTableWidgetItem("기본 정보"))
        self.table.setItem(0, 2, QTableWidgetItem("직업 정보"))

        self.table.setHorizontalHeaderLabels(["", "", ""])
        
        data = [["이름", "나이", "직업"],
                ["홍길동", "25", "개발자"],
                ["김철수", "30", "디자이너"],
                ["이영희", "28", "마케터"]]
        
        for row, rowData in enumerate(data):
            for col, value in enumerate(rowData):
                item = QTableWidgetItem(value)
                if row % 2 == 1:
                    item.setBackground(QColor(240, 240, 240))  # 회색 배경 적용
                self.table.setItem(row + 1, col, item)
        
        self.table.resizeColumnsToContents()
        self.table.resizeRowsToContents()
        
        layout.addWidget(self.table)
        self.setLayout(layout)

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

 

이제 테이블의 배경색을 행마다 다르게 적용하여 가독성을 높였습니다.


3. 표를 추가할 수 있는 기능 목록

기능 설명
행 추가 사용자가 행을 추가할 수 있도록 구현
열 추가 열을 동적으로 추가하는 기능
데이터 수정 셀 데이터를 수정 가능하도록 설정
셀 병합 특정 셀을 병합하여 다중 헤더 표현
CSV 저장 테이블 데이터를 CSV 파일로 저장
필터링 특정 열을 기준으로 필터링 기능 구현

예제 코드: 행 추가 기능 구현

def add_row(self):
    row_position = self.table.rowCount()
    self.table.insertRow(row_position)
    self.table.setItem(row_position, 0, QTableWidgetItem("새로운 이름"))
    self.table.setItem(row_position, 1, QTableWidgetItem("나이"))
    self.table.setItem(row_position, 2, QTableWidgetItem("직업"))
반응형