환경 ;
참고 ; https://wiki.python.org/moin/PyQt/Handling%20context%20menus
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 [취미로 하는 프로그래밍 !!!]