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

[PySide6] QTableWidget 사용방법 : 테이블생성 및 사진, 체크박스 넣는 코드

by 브링블링 2024. 3. 19.
728x90

[PySide6] QTableWidget 사용방법 : 테이블생성 및 사진, 체크박스 넣는 코드

QTableWidget은 Qt 위젯 라이브러리의 일부로, 표 형태의 데이터를 표시하고 관리하기 위한 간편하고 사용하기 쉬운 인터페이스를 제공합니다. QTableWidget은 행과 열로 구성된 격자(grid)에서 아이템을 표시하는 데 사용됩니다. 이 위젯은 각 셀에 텍스트, 이미지 등의 다양한 종류의 아이템을 표시할 수 있으며, 사용자가 셀을 선택하거나 편집하는 것을 지원합니다.

QTableWidget의 주요 특징

특징 설명
행과 열 구성 데이터를 행과 열로 구성된 테이블 형태로 표시합니다.
아이템 기반 각 셀에는 QTableWidgetItem 객체를 할당하여 텍스트, 아이콘 등을 표시할 수 있습니다.
사용자 상호작용 지원 사용자가 테이블의 아이템을 선택하거나, 데이터를 직접 편집할 수 있습니다.
정렬 기능 테이블의 컬럼 헤더를 클릭하여 해당 컬럼을 기준으로 아이템들을 정렬할 수 있습니다.
선택 모드 및 선택 동작 다양한 선택 모드(단일 선택, 다중 선택 등)와 선택 동작(셀 선택, 행 선택, 열 선택 등)을 지원합니다.
사용자 정의 가능 테이블의 외관 및 동작을 사용자가 쉽게 커스터마이징할 수 있습니다.

 

사용 방법 기본 예제 코드

아래의 예제 코드는 QTableWidget을 생성하고 기본적인 데이터를 추가하는 방법입니다. 이 코드는 4행 2열의 테이블을 생성하고, 각 행에 '이름'과 '나이' 데이터를 채웁니다. 또한, 테이블의 열 제목을 설정하고, 생성된 QTableWidget을 메인 윈도우의 중앙 위젯으로 설정합니다.

import sys
from PySide6.QtWidgets import QApplication, QMainWindow, QTableWidget, QTableWidgetItem

class ExampleMainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.initUI()
    
    def initUI(self):
        # QTableWidget 생성
        tableWidget = QTableWidget()
        self.setCentralWidget(tableWidget)
        
        # 4행 2열 설정
        tableWidget.setRowCount(4)
        tableWidget.setColumnCount(2)
        
        # 열 제목 설정
        tableWidget.setHorizontalHeaderLabels(['이름', '나이'])
        
        # 데이터 추가
        items = [['김철수', '29'], ['이영희', '34'], ['박민수', '23'], ['최예진', '31']]
        for row, (name, age) in enumerate(items):
            tableWidget.setItem(row, 0, QTableWidgetItem(name))
            tableWidget.setItem(row, 1, QTableWidgetItem(age))
        
        # 윈도우 설정
        self.setGeometry(300, 300, 250, 150)
        self.setWindowTitle('QTableWidget 예제')

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = ExampleMainWindow()
    ex.show()
    sys.exit(app.exec())

 

테이블 안에 이미지와 체크박스를 넣어서 사용하는 예제코드

예제에서는 QTableWidget, QTableWidgetItem, 그리고 QCheckBox 위젯을 사용하여 각 행에 이미지와 체크박스를 포함시킬 것입니다. 이미지는 QLabel에 표시되며, QTableWidgetItem의 아이콘으로 설정할 수도 있습니다. 이 경우, QLabel에 이미지를 설정하고, 이를 QTableWidget의 셀 위젯으로 추가하는 방법을 사용합니다.

import sys
from PySide6.QtWidgets import (QApplication, QMainWindow, QTableWidget, 
                               QTableWidgetItem, QLabel, QWidget, QHBoxLayout, 
                               QCheckBox)
from PySide6.QtGui import QPixmap
from PySide6.QtCore import Qt

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Table : Image & CheckBox")
        self.setGeometry(100, 100, 400, 300)

        # QTableWidget 설정
        self.tableWidget = QTableWidget()
        self.setCentralWidget(self.tableWidget)
        self.tableWidget.setRowCount(3)  # 행의 수 설정
        self.tableWidget.setColumnCount(2)  # 열의 수 설정: 이미지와 체크박스

        # 열 제목 설정
        self.tableWidget.setHorizontalHeaderLabels(['Image', 'CheckBox'])

        # 테이블 데이터 설정
        for row in range(3):
            # 이미지 삽입
            imgLabel = QLabel()
            #imgLabel.setPixmap(QPixmap('your_image_path.png').scaled(50, 50, Qt.KeepAspectRatio))  # 이미지 경로와 크기 조정
            imgLabel.setPixmap(QPixmap('..\\Resource\\info_FILL0_wght400_GRAD0_opsz24.png').scaled(50, 50, Qt.KeepAspectRatio))  # 이미지 경로와 크기 조정
            imgLabel.setAlignment(Qt.AlignCenter)
            self.tableWidget.setCellWidget(row, 0, imgLabel)

            # 체크박스 삽입
            checkBox = QCheckBox()
            #checkBox.setAlignment(Qt.AlignCenter)
            checkBoxWidget = QWidget()
            checkBoxLayout = QHBoxLayout(checkBoxWidget)
            checkBoxLayout.addWidget(checkBox)
            checkBoxLayout.setAlignment(Qt.AlignCenter)
            checkBoxLayout.setContentsMargins(0, 0, 0, 0)
            self.tableWidget.setCellWidget(row, 1, checkBoxWidget)

        # 열 너비 설정
        self.tableWidget.setColumnWidth(0, 100)
        self.tableWidget.setColumnWidth(1, 100)

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

 

728x90

체크박스를 포함한 리스트 테이블을 만드는 예제 코드

이 예제에서는 QTableWidget을 사용하여 테이블을 생성하고, 각 행에 체크박스를 추가합니다. 간단한 데이터 리스트를 테이블에 채우고, 사용자가 체크박스를 선택할 수 있게 합니다.

import sys
from PySide6.QtWidgets import (QApplication, QMainWindow, QTableWidget, 
                               QTableWidgetItem, QCheckBox, QVBoxLayout,
                               QWidget, QHeaderView)
from PySide6.QtCore import Qt

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("test list1")
        self.setGeometry(100, 100, 600, 400)

        # 테이블 위젯 생성 및 설정
        self.tableWidget = QTableWidget()
        self.tableWidget.setColumnCount(2)  # 두 개의 컬럼 설정: 하나는 데이터, 다른 하나는 체크박스
        self.tableWidget.setHorizontalHeaderLabels(['SELECT', 'ITEM'])  # 컬럼 제목 설정

        # 데이터 추가
        data = ["ITEM 1", "ITEM 2", "ITEM 3", "ITEM 4"]
        self.tableWidget.setRowCount(len(data))

        for i, item in enumerate(data):
            self.tableWidget.setItem(i, 1, QTableWidgetItem(item))
            chkBoxItem = QTableWidgetItem()
            chkBoxItem.setText(f'PORT {i+1}')
            chkBoxItem.setFlags(Qt.ItemIsEnabled | Qt.ItemIsUserCheckable)# chkBoxItem.flags() | Qt.ItemIsUserCheckable)
            chkBoxItem.setCheckState(Qt.Unchecked)
            self.tableWidget.setItem(i, 0, chkBoxItem)

        # 테이블 크기 자동 조정
        self.tableWidget.horizontalHeader().setStretchLastSection(True)
        self.tableWidget.horizontalHeader().setSectionResizeMode(0, QHeaderView.Stretch)

        # 레이아웃 설정 및 위젯 추가
        layout = QVBoxLayout()
        layout.addWidget(self.tableWidget)
        widget = QWidget()
        widget.setLayout(layout)
        self.setCentralWidget(widget)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    mainWindow = MainWindow()
    mainWindow.show()
    sys.exit(app.exec())
  • QMainWindow를 상속받는 MainWindow 클래스를 생성하여, 윈도우의 기본 설정(제목, 크기)을 지정합니다.
  • QTableWidget을 사용하여 테이블을 생성하고, 두 개의 컬럼(하나는 데이터를 위한 것이고, 다른 하나는 체크박스를 위한 것)을 설정합니다.
  • 각 행에 대해 첫 번째 컬럼에는 문자열 데이터를, 두 번째 컬럼에는 체크 가능한 상태의 QTableWidgetItem을 추가합니다.
  • horizontalHeader().setStretchLastSection(True)을 사용하여 마지막 컬럼을 테이블 너비에 맞게 자동으로 조정하도록 합니다.
  • horizontalHeader().setSectionResizeMode(0, QHeaderView.Stretch)를 사용하여 첫 번째 컬럼의 너비를 테이블 너비에 맞게 자동으로 조정하도록 합니다.

QTableWidgetItem().setFlag()에서 사용할 수 있는 파라미터

QTableWidgetItemsetFlag() 메서드는 아이템의 다양한 속성을 설정하는 데 사용됩니다. 이 메서드를 사용하여 아이템이 선택 가능한지, 편집 가능한지, 드래그 & 드롭 가능한지 등을 제어할 수 있습니다. setFlag() 메서드에 전달할 수 있는 파라미터는 Qt.ItemFlag 열거형에 정의된 값들입니다. 주요 Qt.ItemFlag 값들과 그 설명은 다음과 같습니다.

Flag 설명
Qt.ItemIsSelectable 아이템이 선택될 수 있음을 나타냅니다.
Qt.ItemIsEditable 아이템을 더블 클릭하거나 엔터 키를 눌러 편집할 수 있음을 나타냅니다.
Qt.ItemIsDragEnabled 아이템이 드래그될 수 있음을 나타냅니다.
Qt.ItemIsDropEnabled 다른 아이템들이 이 아이템 위에 드롭될 수 있음을 나타냅니다.
Qt.ItemIsUserCheckable 아이템 옆에 체크박스 또는 라디오 버튼을 표시할 수 있음을 나타냅니다. 아이템의 체크 상태는 setCheckState() 메서드로 설정할 수 있습니다.
Qt.ItemIsEnabled 아이템이 사용자와 상호작용할 수 있음을 나타냅니다. 비활성화된 아이템은 회색으로 표시됩니다.
Qt.ItemIsTristate 아이템이 세 가지 상태(체크됨, 체크되지 않음, 부분적으로 체크됨)를 가질 수 있음을 나타냅니다.

 

아래의 예제 코드는 QTableWidget에 몇 가지 행을 추가하고, 각 행의 아이템에 대해 다양한 setFlag() 설정을 적용하는 방법입니다.

import sys
from PySide6.QtWidgets import QApplication, QMainWindow, QTableWidget, QTableWidgetItem
from PySide6.QtCore import Qt

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("QTableWidgetItem Flags 예제")
        self.setGeometry(100, 100, 400, 200)

        # QTableWidget 설정
        self.tableWidget = QTableWidget(4, 2)  # 4행 2열
        self.setCentralWidget(self.tableWidget)
        self.tableWidget.setHorizontalHeaderLabels(['이름', '설정'])

        # 테이블 아이템 설정
        items = ['선택 가능', '편집 가능', '체크 가능', '비활성화']
        flags = [Qt.ItemIsSelectable, Qt.ItemIsEditable, Qt.ItemIsUserCheckable, Qt.ItemIsEnabled]

        for i, (item, flag) in enumerate(zip(items, flags)):
            nameItem = QTableWidgetItem(item)
            self.tableWidget.setItem(i, 0, nameItem)
            
            settingItem = QTableWidgetItem('설정됨')
            settingItem.setFlags(settingItem.flags() | flag)  # 플래그 추가
            
            if flag == Qt.ItemIsUserCheckable:  # 체크 가능 아이템 설정
                settingItem.setCheckState(Qt.Checked)
                
            if flag == Qt.ItemIsEnabled:  # 비활성화 아이템 설정
                settingItem.setFlags(settingItem.flags() & ~Qt.ItemIsEnabled)  # 플래그 제거
                
            self.tableWidget.setItem(i, 1, settingItem)

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

 

728x90