PyQt5 - QTableWidget(테이블 위젯) 사용하기 2
본문 바로가기
파이썬(Python)/파이썬 GUI(PyQt5 & tkinter)

PyQt5 - QTableWidget(테이블 위젯) 사용하기 2

by Squat Lee 2020. 12. 14.

 

QTableWidget을 사용하는 두번째 방법입니다.

 

이번 코드는 좀 복잡해서 저도 다 이해하지 못했습니다.

 

대충 이렇구나 이해하면서, 다음부터는 Qt Designer 를 포스트 할까 합니다.

 

QT Designer는 일일이 UI를 다 만들어줄 필요 없이 드레그 앤 드롭으로 작성이 가능하며, 함수만 연결해 주면 됩니다.

 

제가 워낙 초보라 그것도 이해가 어려워서 일일이 다시 공부하고 있습니다.

 

import sys

from PyQt5.QtWidgets import *

from PyQt5.QtCore import *

 

필요한 모듈을 불러옵니다.

 

class TestWindow(QMainWindow):

    def __init__(self):

        super().__init__()

        self.setupUI()

 

윈도우 클래스를 생성합니다.

 

def setupUI(self):

        self.setWindowTitle('TestWindow')

 

        self.tableWidget = QTableWidget(self)

        self.tableWidget.resize(400,300)

        self.tableWidget.setRowCount(3)

        self.tableWidget.setColumnCount(3)

        self.tableWidget.setEditTriggers(QAbstractItemView.NoEditTriggers)

 

각 테이블 위젯을 세팅합니다. 'setEditTriggers' 메서드는 QTableWidget의 아이템 항목을 수정할 수 없도록 설정합니다.

 

students = {

            'no': ['2020001''2020002''2020003'],

            'name' : ['이성계''정도전''정몽주'],

            'group' : ['1학년''2학년''3학년']

        }

studnets라는 딕션네리를 만듭니다.

 

column_index_lookup = {'no':0'name':1'group':2}

 

column 인덱스를 지정합니다.

 

 column_headers = ['학번''이름''학년']

        self.tableWidget.setHorizontalHeaderLabels(column_headers)

 

header를 지정합니다.

 

for k, v in students.items():

            col = column_index_lookup[k]

            print(k,v,col)

            for row, val in enumerate(v):

                item = QTableWidgetItem(val)

                if col == 2:

                    item.setTextAlignment(Qt.AlignVCenter | Qt.AlignRight)

 

                self.tableWidget.setItem(row, col, item)

 

3x3 크기의 QTableWidget에 아이템을 채우는 코든는 (행,열) 위치에 대한 인덱스를 구하고 해당 위치에 문자열을 넣는 방식으로 구현했습니다. 이때 열(column)에 대한 인덱스는 미리 정의된 column_index_looup이라는 딕션네리를 사요합니다.

 

QTableWidget에 아이템으로 삽입하려면 먼저 데이터를 QTableWidgetItem 객체로 만들어야 합니다. 그런 다음 setItem 메서드를 이용해 아이템을 원하는 위치에 삽입하면 됩니다. 

 

k, v, col은 각각 아래와 같이 출력이 됩니다.

 

 

전체 코드는 아래와 같습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
 
class TestWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setupUI()
 
    def setupUI(self):
        self.setWindowTitle('TestWindow')
 
        self.tableWidget = QTableWidget(self)
        self.tableWidget.resize(400,300)
        self.tableWidget.setRowCount(3)
        self.tableWidget.setColumnCount(3)
        self.tableWidget.setEditTriggers(QAbstractItemView.NoEditTriggers)
 
        students = {
            'no': ['2020001''2020002''2020003'],
            'name' : ['이성계''정도전''정몽주'],
            'group' : ['1학년''2학년''3학년']
        }
        column_index_lookup = {'no':0'name':1'group':2}
 
        column_headers = ['학번''이름''학년']
        self.tableWidget.setHorizontalHeaderLabels(column_headers)
 
        for k, v in students.items():
            col = column_index_lookup[k]
            print(k,v,col)
            for row, val in enumerate(v):
                item = QTableWidgetItem(val)
                if col == 2:
                    item.setTextAlignment(Qt.AlignVCenter | Qt.AlignRight)
 
                self.tableWidget.setItem(row, col, item)
 
        self.tableWidget.resizeColumnsToContents()
        self.tableWidget.resizeRowsToContents()
 
if __name__=='__main__':
    app = QApplication(sys.argv)
    window = TestWindow()
    window.show()
    app.exec_()
cs

 

728x90
반응형

댓글