본문 바로가기
프로그래밍 관련/PyQt

PyQt. TableWidget(기본)

by 존버매니아.임베디드 개발자 2021. 12. 3.
반응형
  • Table 기본 형태 생성
  • 행 추가하기  &  추가된 행에 텍스트 채워넣기
  • 테이블의 마지막에 행 한개씩 추가하기
  • 테이블의 마지막에 행 1개씩 추가하기(2)
  • 특정 셀에 접근하기. (해당 셀의 문자열 받아오기, 해당 셀의 문자열 set하기)
  • 아무 것도 추가하지 않은 비어있는 셀에 관해 유의할 점
  • 테이블 행 삭제
  • 테이블 행 전부 삭제

Table 기본 형태 생성

import sys
from PyQt5.QtWidgets import *

class MyWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setupUI()

    def setupUI(self):
        self.setGeometry(800, 200, 600, 300)

        self.ta1 = QTableWidget(self)
        self.ta1.resize(500, 500)
        self.ta1.setColumnCount(3)       

        table_column=["첫번째 열" , "두번째 열" , "Third 열"]
        self.ta1.setHorizontalHeaderLabels(table_column)      

    
if __name__ == "__main__":
    app = QApplication(sys.argv)
    mywindow = MyWindow()
    mywindow.show()
    app.exec_()

컬럼 헤더만 생성되고 아직 행에 데이터가 추가되지 않았음


행 추가하기  &  추가된 행에 텍스트 채워넣기

행에 데이터를 추가하려면

setRowCount(행 갯수) 

메소드를 사용해야한다.

 

setRowCount(5)

이런식으로 메소드를 호출하면

테이블에 5개의 내용없이 비어진 행이 생성된다.

 

반면 insertRow(행 번호)는 엑셀에서 행을 1개 추가로 삽입하는거랑 같은 효과라고 생각하면된다.

이 때 파라미터로 전달되는 숫자는 행 숫자를 의미하는데, 행 숫자는 0부터 시작됨에 유의하자.

ex) insertRow(1)을 하면 위에서 두번째 행이 새로 생긴다. 0행부터 시작해서 1행에 추가됨

    insertRow(3)을 하면 위에서 네번째 행이 새로 생김( 0부터 시작하니까 3이 네번째를 의미함)

 

 

한편, setItem(행번호,열번호, QTableWidgetItem("추가하려는 내용"))

요런식으로 써서 추가된 행에 데이터를 채워넣을 수 있다. 아래 예시 참고

import sys
from PyQt5.QtWidgets import *

class MyWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setupUI()

    def setupUI(self):
        self.setGeometry(800, 200, 600, 300)

        self.ta1 = QTableWidget(self)
        self.ta1.resize(500, 500)
        self.ta1.setColumnCount(3)       

        table_column=["첫번째 열" , "두번째 열" , "Third 열"]
        self.ta1.setHorizontalHeaderLabels(table_column)

        
        #행 2개 추가
        self.ta1.setRowCount(2)
        
        #추가된 행에 데이터 채워넣음
        self.ta1.setItem(0, 0, QTableWidgetItem("(0,0)"))
        self.ta1.setItem(0, 1, QTableWidgetItem("(0,1)"))
        self.ta1.setItem(1, 0, QTableWidgetItem("(1,0)"))
        self.ta1.setItem(1, 1, QTableWidgetItem("(1,1)"))       
        
    
if __name__ == "__main__":
    app = QApplication(sys.argv)
    mywindow = MyWindow()
    mywindow.show()
    app.exec_()


테이블의 마지막에 행 한개씩 추가하기

이렇게 하고 싶으면?

마지막에 행을 한개 추가하면 되는데

insertRow 메소드를 사용하면 된다.

참고로, 위 예시의 경우 3번째 행에 행을 추가할 거니까 0부터 시작해서 0,1,2 니까

insertRow(2)를 해야한다.

import sys
from PyQt5.QtWidgets import *

class MyWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setupUI()

    def setupUI(self):
        self.setGeometry(800, 200, 600, 300)

        self.ta1 = QTableWidget(self)
        self.ta1.resize(500, 500)
        self.ta1.setColumnCount(3)       

        table_column=["첫번째 열" , "두번째 열" , "Third 열"]
        self.ta1.setHorizontalHeaderLabels(table_column)

        
        #행 2개 추가
        self.ta1.setRowCount(2)
        
        #추가된 행에 데이터 채워넣음
        self.ta1.setItem(0, 0, QTableWidgetItem("(0,0)"))
        self.ta1.setItem(0, 1, QTableWidgetItem("(0,1)"))
        self.ta1.setItem(1, 0, QTableWidgetItem("(1,0)"))
        self.ta1.setItem(1, 1, QTableWidgetItem("(1,1)"))
        
        #마지막에 행 1개추가
        self.ta1.insertRow(2)
        self.ta1.setItem(2, 0, QTableWidgetItem("New Data"))
        
    
if __name__ == "__main__":
    app = QApplication(sys.argv)
    mywindow = MyWindow()
    mywindow.show()
    app.exec_()

 


테이블의 마지막에 행 1개씩 추가하기(2)

테이블위젯은 rowCount() 라는 메소드가 있는데

현재 테이블에 몇개의 행이 있는지를 return 해주는 메소드이다.

이것과 insertRow 메소드를 섞어서 쓰면

마지막에 행 한개씩 추가하는 기능을 일반화해서 표현할 수 있다.

self.ta1.insertRow(self.ta1.rowCount())


  • 특정 셀에 접근하기. (해당 셀의 문자열 받아오기, 해당 셀의 문자열 set하기)

 

def item(self, row: int, column: int) -> QTableWidgetItem: ...

TableWidget에서 item 메소드를 사용해서 특정 위치에 존재하는 QTableWidgetItem 에 접근한 후,

 

   특정 셀에 적혀있는 문자열 받아오기

->QTableWidgetItem 클래스의 text() 메소드

   특정 셀에 문자열 변경하기(set 하기)

->QTableWidgetItem 클래스의 setText(str) 메소드

import sys
from PyQt5.QtWidgets import *

class MyWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setupUI()

    def setupUI(self):
        self.setGeometry(800, 200, 800, 300)       

        self.ta1 = QTableWidget(self)
        self.ta1.resize(400, 500)
        self.ta1.setColumnCount(3)       

        table_column=["첫번째 열" , "두번째 열" , "Third 열"]
        self.ta1.setHorizontalHeaderLabels(table_column)

        
        #행 2개 추가
        self.ta1.setRowCount(2)
        
        #추가된 행에 데이터 채워넣음
        self.ta1.setItem(0, 0, QTableWidgetItem("(0,0)"))
        self.ta1.setItem(0, 1, QTableWidgetItem("(0,1)"))
        self.ta1.setItem(1, 0, QTableWidgetItem("(1,0)"))
        self.ta1.setItem(1, 1, QTableWidgetItem("(1,1)"))
        
        #셀의 텍스트 변경   
        self.ta1.item(1,1).setText("데이터 변경")

        #셀에 있는 텍스트 출력     
        print(self.ta1.item(0,1).text())
                

    
if __name__ == "__main__":
    app = QApplication(sys.argv)
    mywindow = MyWindow()
    mywindow.show()
    app.exec_()


아무 것도 추가하지 않은 비어있는 셀에 관해 유의할 점

그래서 위의 그림과 같은 상황에서

self.ta1.item(0,2).setText("데이터 추가") 

self.ta1.item(0,2).Text()

만약 이런식으로 코드를 구현하면 에러가 발생한다.

왜냐면 item(0,2)로 접근했을 때 원래는 item 메소드가 QTableWidgetItem 객체를 return 해야하는데

위 그림의 경우 0행2열에는 애초에 QTableWidgetItem 객체가 없기 때문이다.


테이블 행 삭제

removeRow(행번호) 메소드를 쓰면된다. 파라미터는 삭제하려는 row 번호

( row는 0번 부터 시작함을 유의)


테이블 행 전부 삭제

테이블에 등록된 모든 행을 삭제하려면?

removeRow를 일일이 할 필요 없이

setRowCount(0) 을 호출하면 행이 0개가 되니까 싸그리 삭제된다.

 

혹은 만들어진 행은 그대로 놔두고 안에 내용만 날리고싶을때는

clear() 메소드를 사용한다.

반응형