Qt/PyQt5 강좌
테이블(QTableWidget)에 콤보박스(QComboBox) 추가하기
webnautes
2024. 9. 1. 22:25
반응형
테이블(QTableWidget)에 콤보박스(QComboBox) 추가하는 예제 코드입니다.
2024. 9. 1 최초작성
표안에 있는 콤보박스를 사용하여 가격을 선택할 수 있도록 작성된 예제입니다.
전체 코드입니다.
import sys from PyQt5.QtWidgets import QApplication, QWidget, QTableWidget, QTableWidgetItem, QVBoxLayout, QComboBox, QHeaderView, QSizePolicy from PyQt5.QtCore import Qt class ProductTable(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): self.setWindowTitle('상품 선택 테이블') self.setGeometry(100, 100, 600, 400) # 윈도우 크기와 위치 설정 layout = QVBoxLayout() self.table = QTableWidget() self.table.setColumnCount(4) self.table.setHorizontalHeaderLabels(['상품명', '단가', '개수', '합계']) layout.addWidget(self.table) self.products = [ {'name': '우유', 'price': 2500}, {'name': '식빵', 'price': 3000}, {'name': '계란', 'price': 5000} ] self.table.setRowCount(len(self.products) + 1) # 제품 수 + 총합계 행 for row, product in enumerate(self.products): self.table.setItem(row, 0, QTableWidgetItem(product['name'])) price_item = QTableWidgetItem(f"{product['price']}원") price_item.setTextAlignment(Qt.AlignRight | Qt.AlignVCenter) self.table.setItem(row, 1, price_item) combo = QComboBox() combo.addItems([str(i) for i in range(11)]) # 0부터 10까지 combo.currentIndexChanged.connect(self.updateTotal) self.table.setCellWidget(row, 2, combo) sum_item = QTableWidgetItem('0원') sum_item.setTextAlignment(Qt.AlignRight | Qt.AlignVCenter) self.table.setItem(row, 3, sum_item) # 총합계 행 추가 self.table.setItem(len(self.products), 0, QTableWidgetItem('총합계')) total_sum_item = QTableWidgetItem('0원') total_sum_item.setTextAlignment(Qt.AlignRight | Qt.AlignVCenter) self.table.setItem(len(self.products), 3, total_sum_item) self.setLayout(layout) # 테이블 헤더 스타일 설정 header = self.table.horizontalHeader() header.setStyleSheet("QHeaderView::section { background-color: lightblue; }") # 열 너비 설정 self.table.horizontalHeader().setSectionResizeMode(0, QHeaderView.Stretch) # 상품명 self.table.setColumnWidth(1, 100) # 단가 self.table.setColumnWidth(2, 100) # 개수 self.table.setColumnWidth(3, 150) # 합계 # 테이블 크기 정책 설정 self.table.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) # 행 높이 설정 for row in range(self.table.rowCount()): self.table.setRowHeight(row, 30) def updateTotal(self): total = 0 for row in range(len(self.products)): price = int(self.table.item(row, 1).text().replace('원', '').replace(',', '')) quantity = int(self.table.cellWidget(row, 2).currentText()) subtotal = price * quantity sum_item = QTableWidgetItem(f"{subtotal:,}원") # 천 단위 구분기호 추가 sum_item.setTextAlignment(Qt.AlignRight | Qt.AlignVCenter) self.table.setItem(row, 3, sum_item) total += subtotal # 총합계 업데이트 total_sum_item = QTableWidgetItem(f"{total:,}원") # 천 단위 구분기호 추가 total_sum_item.setTextAlignment(Qt.AlignRight | Qt.AlignVCenter) self.table.setItem(len(self.products), 3, total_sum_item) if __name__ == '__main__': app = QApplication(sys.argv) ex = ProductTable() ex.show() sys.exit(app.exec_()) |
반응형