본문으로 바로가기

환경 ;

 

참고 ; https://wiki.python.org/moin/PyQt/Handling%20context%20menus

        http://codeprogress.com/python/libraries/pyqt/showPyQTExample.php?index=375&key=PyQtContextMenuEvent&version=5

        http://pyqt.sourceforge.net/Docs/PyQt4/qmenu.html#exec-2

 

        http://doc.qt.io/qt-5/qwidget.html#contextMenuEvent

 

 

 

context menu 사용시에는 ContextMenuPolicy 를 사용하여 아래의 3가지 방법중 하나를 이용한다.

아무 설정 안하면, 기본적으로 DefaultContextMenu 정책이 사용된다.

 

 

 

<< ContextMenuPolicy 사용하는 3가지 방법 >>

 

방법 1. DefaultContextMenu

   --  contextMenuEvent() 호출함.

 

방법 2. ActionsContextMenu

   -- actions() 사용.

 

방법 3. CustomContextMenu

   -- customContextMenuRequested() signal 발생시킴.

 

 

 

 

 

** 실행화면

 

 

 

 

<< 방법 1. >>

 

** 소스

 

from PyQt5.QtWidgets import *
 
 
class TableWidget(QTableWidget):
def __init__(self, parent=None):
QTableWidget.__init__(self, parent)
self.setColumnCount(3)
self.setRowCount(3)
 
def contextMenuEvent(self, event):
"""
ContextMenuPolicy --> DefaultContextMenu
"""
print(event.pos())
print(self.mapToGlobal(event.pos()))
 
menu = QMenu(self)
copy_action = menu.addAction("복사하기")
quit_action = menu.addAction("Quit")
 
action = menu.exec_(self.mapToGlobal(event.pos()))
if action == quit_action:
qApp.quit()
elif action == copy_action:
print("copy...")
 
 
if __name__ == "__main__":
import sys
 
app = QApplication([])
tableWidget = TableWidget()
tableWidget.show()
sys.exit(app.exec_())

view rawcontextmenu_test1.py hosted with ❤ by GitHub

 

--

 

 

 

<< 방법 2-1 >>

 

widget 을 상속받아 구현하기...

 

** 소스

 

from PyQt5.QtCore import Qt, pyqtSlot
from PyQt5.QtWidgets import *
 
 
class TableWidget(QTableWidget):
"""
ContextMenuPolicy --> ActionsContextMenu
"""
def __init__(self, parent=None):
QTableWidget.__init__(self, parent)
self.setColumnCount(3)
self.setRowCount(3)
 
self.setContextMenuPolicy(Qt.ActionsContextMenu)
 
copy_action = QAction("복사하기", self)
quit_action = QAction("Quit", self)
 
self.addAction(copy_action)
self.addAction(quit_action)
 
quit_action.triggered.connect(qApp.quit)
copy_action.triggered.connect(self.__copy)
 
@pyqtSlot()
def __copy(self):
print("복사...")
 
 
if __name__ == "__main__":
import sys
 
app = QApplication([])
tableWidget = TableWidget()
tableWidget.show()
sys.exit(app.exec_())

view rawcontextmenu_test2_1.py hosted with ❤ by GitHub

 

--

 

<< 방법 2-2 >>

 

widget 을 상속받지 않고 구현하기...

 

** 소스

 

from PyQt5.QtCore import Qt, pyqtSlot
from PyQt5.QtWidgets import *
 
 
class MyTest(QWidget):
"""
ContextMenuPolicy --> ActionsContextMenu
"""
def __init__(self):
super().__init__()
vbox = QVBoxLayout()
 
table = QTableWidget(self)
table.setColumnCount(3)
table.setRowCount(2)
 
table.setContextMenuPolicy(Qt.ActionsContextMenu)
 
copy_action = QAction("복사하기", table)
quit_action = QAction("Quit", table)
 
table.addAction(copy_action)
table.addAction(quit_action)
 
copy_action.triggered.connect(self.__copy)
quit_action.triggered.connect(qApp.quit)
 
# table.show()
vbox.addWidget(table)
self.setLayout(vbox)
self.resize(300, 200)
 
@pyqtSlot()
def __copy(self):
print("복사...")
 
 
if __name__ == '__main__':
import sys
 
app = QApplication(sys.argv)
ex = MyTest()
ex.show()
sys.exit(app.exec_())

view rawcontextmenu_test2_2.py hosted with ❤ by GitHub

 

--

 

<< 방법 3. >>

 

 

** 소스

 

from PyQt5.QtCore import Qt, QPoint, pyqtSlot
from PyQt5.QtWidgets import *
 
 
class MyTest(QWidget):
"""
ContextMenuPolicy --> CustomContextMenu
 
; QPoint를 매개변수로 사용하는 customContextMenuRequested singal을 사용한다.
"""
def __init__(self):
super().__init__()
vbox = QVBoxLayout()
 
self.table = QTableWidget()
self.table.setColumnCount(3)
self.table.setRowCount(3)
 
self.table.setContextMenuPolicy(Qt.CustomContextMenu)
 
self.table.customContextMenuRequested.connect(self.__context_menu)
 
vbox.addWidget(self.table)
self.setLayout(vbox)
 
# @pyqtSlot('QPoint')
@pyqtSlot(QPoint)
def __context_menu(self, position):
menu = QMenu()
copy_action = menu.addAction("복사하기")
quit_action = menu.addAction("Quit")
action = menu.exec_(self.table.mapToGlobal(position))
if action == quit_action:
qApp.quit()
elif action == copy_action:
print("copy...")
 
 
if __name__ == '__main__':
import sys
 
app = QApplication(sys.argv)
ex = MyTest()
ex.show()
sys.exit(app.exec_())

view rawcontextmenu_test3.py hosted with ❤ by GitHub

 

--



출처: https://freeprog.tistory.com/334 [취미로 하는 프로그래밍 !!!]