공유 블로그

다운로드

https://github.com/h12sw06/pyqt5/blob/main/test.py

 

GitHub - h12sw06/pyqt5

Contribute to h12sw06/pyqt5 development by creating an account on GitHub.

github.com

 

코드

import sys
from PyQt5 import QtCore
from PyQt5.QtWidgets import *


class MyApp(QWidget):

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

    def initUI(self):
        ######UI 세팅########
        self.tableWidget = QTableWidget()
        self.tableWidget.setRowCount(2)
        self.tableWidget.setColumnCount(2)

        self.tableWidget.setItem(0, 0, QTableWidgetItem('Apple'))
        self.tableWidget.setItem(0, 1, QTableWidgetItem('Banana'))
        self.tableWidget.setItem(1, 0, QTableWidgetItem('Orange'))
        self.tableWidget.setItem(1, 1, QTableWidgetItem('Grape'))

        layout = QVBoxLayout()
        layout.addWidget(self.tableWidget)
        self.setLayout(layout)

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

        # 메뉴바 활성화
        self.tableWidget.setContextMenuPolicy(QtCore.Qt.ContextMenuPolicy.CustomContextMenu)
        # 우클릭시 메뉴바 생성
        self.tableWidget.customContextMenuRequested.connect(self.generateMenu)

        # 만약 다른 클릭으로 메뉴바 생성하고 싶다면
        # self.tableWidget.viewport().installEventFilter(self)

    # installEventFilter사용시 작동(실시간을 요구하기때문에 과부하 많이 걸림)
    def eventFilter(self, source:QtCore.QObject, event:QtCore.QEvent):    
        
        # 마우스 더블클릭시
        if(
            event.type() == QtCore.QEvent.Type.MouseButtonDblClick and
            event.buttons() == QtCore.Qt.MouseButton.LeftButton and
            source is self.tableWidget.viewport()
        ):
            self.generateMenu(event.pos())
        
        
        return super(MyApp, self).eventFilter(source, event)
            

    def generateMenu(self, pos):
        # 빈공간에서
        if(self.tableWidget.itemAt(pos) is None):
            self.emptymMenu = QMenu(self)
            self.emptymMenu.addAction("추가", self.addRow)      
            self.emptymMenu.exec_(self.tableWidget.mapToGlobal(pos)) 
            
        # 아이템에서
        else:
            self.menu = QMenu(self)
            self.menu.addAction("삭제",lambda: self.deleteRow(pos))      
            
            self.menu.exec_(self.tableWidget.mapToGlobal(pos)) 

    def addRow(self):
        print("추가")
        # 마지막줄에 추가하기 위함
        rowPosition =self.tableWidget.rowCount()
        columnPosition =self.tableWidget.columnCount()
        
        self.tableWidget.insertRow(rowPosition)
        
        # 모든 열에 세팅
        for column in range(columnPosition):
            self.tableWidget.setItem(rowPosition,column,QTableWidgetItem(''))
        
        
    def deleteRow(self,pos):
        print("삭제",pos)
        self.tableWidget.removeRow(self.tableWidget.indexAt(pos).row())
        

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

 

코드 설명은 주석 잘되어 있으니 생략

 

--- 확인 ---

더보기

추가 했을경우

빈 공백에서 우클릭 -> 추가
빈테이블 생성됨

삭제 했을 경우

아무 테이블에서 우클릭 -> 삭제
해당 테이블 삭제됨(마우스의 pos(포지션)기준의 테이블이 삭제됨)

 

 

공유하기

facebook twitter kakaoTalk naver band kakaostory Copy URL