QTableWidget (Advanced)


../_images/4_21_qtablewidget_advanced_sample.png

이번에는 QTableWidget 위젯의 다양한 기능을 활용해보겠습니다.

테이블의 상하단으로 이동하는 버튼, 임의의 숫자를 채워넣는 버튼, 모든 항목을 삭제하는 버튼을 만들고

기능을 구현해보겠습니다.


예제

## Ex 5-21-1. QTableWidget (Advanced).

import sys
import numpy as np
from PyQt5.QtWidgets import *


class MyApp(QWidget):

    def __init__(self):
        super().__init__()
        self.initUI()
        self.set_rand_int()

    def initUI(self):

        self.tableWidget = QTableWidget()
        self.tableWidget.setRowCount(20)
        self.tableWidget.setColumnCount(4)

        self.label = QLabel('')

        self.scrollToTop = QPushButton('Scroll to Top')
        self.scrollToTop.clicked.connect(self.tableWidget.scrollToTop)
        self.scrollToBottom = QPushButton('Scroll to Bottom')
        self.scrollToBottom.clicked.connect(self.tableWidget.scrollToBottom)
        self.setItems = QPushButton('Set Items')
        self.setItems.clicked.connect(self.set_rand_int)
        self.clear = QPushButton('Clear')
        self.clear.clicked.connect(self.tableWidget.clear)

        self.tableWidget.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
        self.tableWidget.cellClicked.connect(self.set_label)

        hbox = QHBoxLayout()
        hbox.addWidget(self.scrollToTop)
        hbox.addWidget(self.scrollToBottom)
        hbox.addWidget(self.setItems)
        hbox.addWidget(self.clear)

        vbox = QVBoxLayout()
        vbox.addWidget(self.tableWidget)
        vbox.addWidget(self.label)
        vbox.addLayout(hbox)
        self.setLayout(vbox)

        self.setWindowTitle('QTableWidget')
        self.setGeometry(300, 100, 600, 400)
        self.show()

    def set_rand_int(self):
        rand_int = np.random.randint(1, 100, size=(20, 4))
        for i in range(20):
            for j in range(4):
                self.tableWidget.setItem(i, j, QTableWidgetItem(str(rand_int[i, j])))

    def set_label(self, row, column):
        item = self.tableWidget.item(row, column)
        value = item.text()
        label_str = 'Row: ' + str(row+1) + ', Column: ' + str(column+1) + ', Value: ' + str(value)
        self.label.setText(label_str)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = MyApp()
    sys.exit(app.exec_())

20개의 행과 4개의 열을 갖는 테이블이 만들어집니다.



설명

self.scrollToTop = QPushButton('Scroll to Top')
self.scrollToTop.clicked.connect(self.tableWidget.scrollToTop)
self.scrollToBottom = QPushButton('Scroll to Bottom')
self.scrollToBottom.clicked.connect(self.tableWidget.scrollToBottom)
self.setItems = QPushButton('Set Items')
self.setItems.clicked.connect(self.set_rand_int)
self.clear = QPushButton('Clear')
self.clear.clicked.connect(self.tableWidget.clear)

QPushButton 클래스를 사용해서 네 개의 푸시 버튼을 만들었습니다.

각각 스크롤 상하단 이동 버튼, 테이블에 임의의 숫자를 채우는 버튼, 모든 항목을 삭제하는 버튼입니다.



self.tableWidget.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
self.tableWidget.cellClicked.connect(self.set_label)

setSectionResizeMode() 메서드를 사용해서 테이블 헤더의 폭이 위젯에 맞춰지도록 했습니다.

cellClicked 시그널은 테이블 셀을 클릭했을 때 발생하며, self.set_label 메서드에 연결됩니다.



hbox = QHBoxLayout()
hbox.addWidget(self.scrollToTop)
hbox.addWidget(self.scrollToBottom)
hbox.addWidget(self.setItems)
hbox.addWidget(self.clear)

vbox = QVBoxLayout()
vbox.addWidget(self.tableWidget)
vbox.addWidget(self.label)
vbox.addLayout(hbox)
self.setLayout(vbox)

수평 박스 레이아웃과 수직 박스 레이아웃을 사용해서 QTableWidget, QLabel, QPushButton 위젯을 배치합니다.



def set_rand_int(self):
    rand_int = np.random.randint(1, 100, size=(20, 4))
    for i in range(20):
        for j in range(4):
            self.tableWidget.setItem(i, j, QTableWidgetItem(str(rand_int[i, j])))

set_rand_int 메서드는 테이블의 모든 셀에 임의의 정수를 채우는 기능을 합니다.

np.random.randint() 함수의 사용에 대해서는 이 링크를 참고하세요.



def set_label(self, row, column):
    item = self.tableWidget.item(row, column)
    value = item.text()
    label_str = 'Row: ' + str(row+1) + ', Column: ' + str(column+1) + ', Value: ' + str(value)
    self.label.setText(label_str)

set_label 메서드는 cellClicked 시그널에 연결된 슬롯입니다.

item(row, column)은 주어진 행과 열 위치의 아이템을 반환합니다.

셀을 클릭하면 QTableWidget 위젯 아래 위치하는 라벨에 행과 열의 위치와 값을 표시하도록 했습니다.

결과는 아래와 같습니다.



결과

../_images/4_21_qtablewidget_advanced.png ../_images/4_21_qtablewidget_advanced_mac.png

그림 5-21-1. QTableWidget을 이용해서 테이블 위젯의 다양한 기능 활용하기.



이전글/다음글

이전글 :