반응형

PyQt5 QTableWidget 예제입니다.



2024. 5. 23  최초작성




테이블 위젯에서 항목을 선택하면 한줄이 하이라이트되고, 밑에 있는 텍스트 에디트에  테이블 위젯에서 선택된 줄의 내용이 출력됩니다.

 



import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QTableWidget, QTableWidgetItem, QVBoxLayout, QWidget, QTextEdit
from PyQt5.QtCore import Qt


class MyWindow(QMainWindow):

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

        self.setWindowTitle("PyQt5 테이블 예제")
       

        # 테이블 위젯을 생성
        self.table_widget = QTableWidget()

        # 5줄로 설정
        self.table_widget.setRowCount(5)
        # 컬럼 2개로 설정
        self.table_widget.setColumnCount(2)

        # 컬럼의 이름 설정
        self.table_widget.setHorizontalHeaderLabels(["Column 1", "Column 2"])
       
        # 마우스로 선택시 테이블의 한 줄이 한번에 선택 되도록 설정
        self.table_widget.setSelectionBehavior(QTableWidget.SelectRows)
        self.table_widget.setSelectionMode(QTableWidget.SingleSelection)

        # 수직 스크롤바 제거
        self.table_widget.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)

        # 수평 스크롤바 제거
        self.table_widget.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
       

        # 테이블에 아이템 추가
        for row in range(5):      # 줄 인덱스
            for col in range(2):  # 열 인덱스
                item = QTableWidgetItem(f"Item {row+1},{col+1}")
                self.table_widget.setItem(row, col, item)
       
       
        # 테이블의 셀의 내용에 맞추어 테이블 크기 조정
        self.table_widget.resizeColumnsToContents()
        self.table_widget.resizeRowsToContents()
       
       
        # 테이블 위젯의 크기를 계산하여 크기를 지정
        table_width = self.table_widget.verticalHeader().width() + self.table_widget.horizontalHeader().length() + 2 * self.table_widget.frameWidth()
        table_height = self.table_widget.horizontalHeader().height() + self.table_widget.verticalHeader().length() + 2 * self.table_widget.frameWidth()
        self.table_widget.setFixedSize(table_width, table_height)
       

        # 셀 클릭시 호출될 슬롯함수 지정
        self.table_widget.cellClicked.connect(self.cell_was_clicked)
       
        # 선텍된 테이블의 열 내용을 보여줄 텍스트 에디트 위젯 생성
        self.text_edit = QTextEdit()
        self.text_edit.setReadOnly(True) # 읽기 전용
       
        # 위젯을 세로로 배치하는 레이아웃 생성하고 2개의 위젯을 추가
        layout = QVBoxLayout()
        layout.addWidget(self.table_widget, alignment=Qt.AlignCenter) # 위젯을 가운데 정렬
        layout.addWidget(self.text_edit)
       

        # QWidget을 사용하여 컨테이너를 만들고, 그 컨테이너에 레이아웃을 설정한 다음, 그 컨테이너를 메인 윈도우의 중앙 위젯(=메인 위젯)으로 설정
        container = QWidget()
        container.setLayout(layout)
        self.setCentralWidget(container)
   

    # 셀 클릭시 호출되는 슬롯함수
    def cell_was_clicked(self, row, col):

        # 선택된 열에 해당되는 셀의 내용을 리스트에 저장합니다.
        row_contents = []
        for column in range(self.table_widget.columnCount()):
            row_contents.append(self.table_widget.item(row, column).text())
       
        # 리스트에 있는 내용을 텍스트 에디트 위젯에 출력합니다.
        self.text_edit.setPlainText(", ".join(row_contents))


if __name__ == "__main__":

    # QApplication 객체를 생성합니다. QApplication 클래스는 GUI 애플리케이션을 실행하기 위해 필요한 초기화와 메인 이벤트 루프를 처리합니다.
    app = QApplication(sys.argv)


    # QMainWindow를 상속받은 MyWindow 클래스의 인스턴스를 생성합니다. 애플리케이션의 메인 창(main window) 역할을 합니다.
    window = MyWindow()


    # MyWindow 인스턴스를 화면에 표시합니다.
    window.show()


    # 애플리케이션의 메인 이벤트 루프를 시작하고, 애플리케이션이 종료될 때 종료 코드를 반환합니다.

    # app.exec_()는 이벤트 루프를 시작합니다. 이 이벤트 루프는 사용자 입력(키보드, 마우스 등)을 처리하고, 타이머 이벤트를 처리하며, GUI 화면을 업데이트합니다.
    # sys.exit()는 애플리케이션이 종료될 때 Python 인터프리터를 종료합니다. app.exec_()가 반환하는 코드를 sys.exit()에 전달하여 애플리케이션이 정상적으로 종료되었는지 또는 오류가 발생했는지를 나타냅니다.
    # app.exec_()는 애플리케이션이 종료될 때까지(예: 사용자가 창을 닫을 때까지) 반환하지 않습니다.
    sys.exit(app.exec_())




Ctrl 키를 누른채 마우스로 개별 줄 여러 개를 선택하거나  Shift 키를 누른채 시작 줄과 끝줄을 선택하여 여러줄을 한번에 선택할 수 있습니다.

 

 

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QTableWidget, QTableWidgetItem, QVBoxLayout, QWidget
from PyQt5.QtCore import Qt

class MyWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("PyQt5 Multi-Row Selection Example")
        self.setGeometry(100, 100, 600, 400)

        # 테이블 위젯 생성
        self.table_widget = QTableWidget()
        self.table_widget.setRowCount(10)
        self.table_widget.setColumnCount(3)
        self.table_widget.setHorizontalHeaderLabels(["Column 1", "Column 2", "Column 3"])

        # 테이블에 데이터 추가
        for row in range(10):
            for col in range(3):
                item = QTableWidgetItem(f"Item {row+1},{col+1}")
                self.table_widget.setItem(row, col, item)

        # 여러 줄을 선택할 수 있도록 설정
        self.table_widget.setSelectionMode(QTableWidget.ExtendedSelection)
        self.table_widget.setSelectionBehavior(QTableWidget.SelectRows)

        # 레이아웃 설정
        layout = QVBoxLayout()
        layout.addWidget(self.table_widget)

        container = QWidget()
        container.setLayout(layout)
        self.setCentralWidget(container)

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


반응형

문제 발생시 지나치지 마시고 댓글 남겨주시면 가능한 빨리 답장드립니다.


제가 쓴 책도 한번 검토해보세요 ^^

+ Recent posts