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와 관련된 내용을 학습할 수 있습니다.
- PySide6 공식 문서: https://doc.qt.io/qtforpython/
'코딩취미 > Python' 카테고리의 다른 글
화면의 크기가 변하는 UI에서 위젯을 동일한 위치에 배치하는 방법 : QSpacerItem 와 addStretch 비교 (0) | 2024.08.14 |
---|---|
QLineEdit의 글자 색상과 배경색/테두리 변경 방법 :setStyleSheet (0) | 2024.08.13 |
레이아웃(Layout) 및 위젯(Widget)간의 간격설정 방법 : setSpacing, setContentsMargins, QSpacerItem (0) | 2024.07.30 |
MVC (Model-View-Controller)와 MVVM (Model-View-ViewModel)과 데이터 바인딩(Data Binding) (0) | 2024.07.23 |
파이썬 MVC 패턴 프로젝트 구성 및 예시 (0) | 2024.07.22 |