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

QTableWidget 내부에 QLineEdit 와 QComboBox 추가해서 이벤트 처리하기

by 브링블링 2024. 8. 9.
반응형

QTableWidget 내부에 QLineEdit 와 QComboBox 추가해서 이벤트 처리하기

PySide6를 사용하여 GUI 애플리케이션을 개발할 때, QTableWidget 내부에 다양한 위젯을 추가하여 사용자의 입력을 받을 수 있습니다. 이 글에서는 QTableWidget 내부에 QLineEdit와 QComboBox를 추가하고, 각각의 위젯에서 발생하는 이벤트를 처리하는 방법을 단계별로 설명합니다. 이를 통해 사용자 인터페이스를 더욱 풍부하게 구성하고, 동적인 데이터를 처리하는 방법을 배울 수 있습니다.

1. QTableWidget 설정

QTableWidget은 표 형식의 데이터를 관리하는 데 사용되는 위젯입니다. 이 위젯은 행과 열을 정의하여 다양한 데이터를 관리할 수 있으며, 각 셀에 대해 다양한 종류의 위젯을 삽입할 수 있습니다. 아래 코드는 2행 10열의 QTableWidget을 생성하고, 각 열에 이름을 설정합니다.

self.table_widget = QTableWidget(2, 10, self)
self.table_widget.setHorizontalHeaderLabels([f"Column {i+1}" for i in range(10)])

2. QLineEdit 추가 및 이벤트 처리

QLineEdit는 단일 행의 텍스트 입력을 받을 수 있는 위젯입니다. 이를 QTableWidget의 셀에 추가하면, 사용자가 셀에서 직접 텍스트를 입력할 수 있습니다. 여기서는 QLineEdit을 테이블의 특정 셀에 삽입하고, 텍스트가 변경될 때마다 on_line_edit_changed라는 슬롯이 호출되도록 연결했습니다.

line_edit = QLineEdit(self)
line_edit.setObjectName(f"lineEdit_{row}_{col}")
line_edit.textChanged.connect(self.on_line_edit_changed)
self.table_widget.setCellWidget(row, col, line_edit)

3. QComboBox 추가 및 이벤트 처리

QComboBox는 드롭다운 리스트에서 항목을 선택할 수 있는 위젯입니다. 이를 QTableWidget의 셀에 추가하여, 사용자가 선택한 항목에 따라 동적인 처리를 할 수 있습니다. 코드에서는 QComboBox를 생성하여 5개의 옵션을 추가한 후, 해당 위젯을 테이블 셀에 삽입합니다. 사용자가 옵션을 선택할 때마다 on_combo_box_changed 슬롯이 호출됩니다.

combo_box = QComboBox(self)
combo_box.setObjectName(f"comboBox_{row}_{col}")
combo_box.addItems([f"Option {i+1}" for i in range(5)])
combo_box.currentIndexChanged.connect(self.on_combo_box_changed)
self.table_widget.setCellWidget(row, col, combo_box)
반응형

4. 텍스트 가운데 정렬

QComboBox의 선택된 텍스트를 가운데 정렬하려면 QLineEdit을 커스터마이징하여 사용해야 합니다. 이 코드는 QComboBox의 텍스트를 가운데 정렬하도록 설정합니다. 선택된 항목이 표시되는 부분을 QLineEdit으로 교체하고, 텍스트 정렬을 설정합니다.

line_edit = QLineEdit(self)
line_edit.setAlignment(Qt.AlignCenter)
combo_box.setLineEdit(line_edit)

5. 예제 코드

앞에서 진행한 코드를 조합하면 아래 처럼 만들 수 있습니다. 이 코드는 QTableWidget을 사용하여 2행 10열의 테이블을 만들고, 각 셀에 QLineEdit와 QComboBox를 추가합니다. 사용자가 텍스트를 입력하거나 옵션을 변경하면, 콘솔에 해당 이벤트와 관련된 정보가 출력됩니다.

import sys
from PySide6.QtWidgets import (
    QApplication, QMainWindow, QTableWidget, QLineEdit, QComboBox, QVBoxLayout, QWidget, QPushButton
)
from PySide6.QtCore import Slot, Qt

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        # 테이블 위젯 생성 (2행 10열)
        self.table_widget = QTableWidget(2, 10, self)
        self.table_widget.setHorizontalHeaderLabels([f"Column {i+1}" for i in range(10)])

        # 테이블에 위젯 추가
        for row in range(2):
            for col in range(10):
                if col < 5:
                    # QLineEdit 추가
                    line_edit = QLineEdit(self)
                    line_edit.setObjectName(f"lineEdit_{row}_{col}")
                    line_edit.textChanged.connect(self.on_line_edit_changed)
                    self.table_widget.setCellWidget(row, col, line_edit)
                else:
                    # QComboBox 추가
                    combo_box = QComboBox(self)
                    combo_box.setObjectName(f"comboBox_{row}_{col}")
                    combo_box.addItems([f"Option {i+1}" for i in range(5)])

                    # ComboBox 텍스트 가운데 정렬
                    line_edit = QLineEdit(self)
                    line_edit.setAlignment(Qt.AlignCenter)
                    combo_box.setLineEdit(line_edit)

                    combo_box.currentIndexChanged.connect(self.on_combo_box_changed)
                    self.table_widget.setCellWidget(row, col, combo_box)

        # 레이아웃 설정
        layout = QVBoxLayout()
        layout.addWidget(self.table_widget)

        container = QWidget()
        container.setLayout(layout)
        self.setCentralWidget(container)

        # 윈도우 설정
        self.setWindowTitle("QTableWidget Example")
        self.setGeometry(300, 300, 800, 200)

    @Slot(str)
    def on_line_edit_changed(self, text):
        sender = self.sender()
        print(f"{sender.objectName()} changed to: {text}")

    @Slot(int)
    def on_combo_box_changed(self, index):
        sender = self.sender()
        print(f"{sender.objectName()} changed to: {sender.currentText()}")

if __name__ == "__main__":
    app = QApplication(sys.argv)

    main_window = MainWindow()
    main_window.show()

    sys.exit(app.exec())

레퍼런스

PySide6의 공식 문서를 참고하여 QTableWidget, QLineEdit, QComboBox와 관련된 내용을 학습할 수 있습니다.

반응형