To work with a context menu, we have to reimplement the contextMenuEvent() method.
当我们在PyQT5组件上右键点击窗体时会触发一个事件:contextMenuEvent,
我们要想自己设计右键点击后弹出的事件,我们就必须要重载contextMenuEvent这个方法。
代码:
# coding='utf-8'
from PyQt5.QtWidgets import QApplication, QMainWindow, QMenu, qApp
import sys
class Gui(QMainWindow):
def __init__(self):
super().__init__()
self.start()
def start(self):
self.setGeometry(300, 300, 300, 200)
self.setWindowTitle('Context menu')
self.show()
def contextMenuEvent(self, event) -> None:
menu = QMenu(self)
new_action = menu.addAction('New')
open_action = menu.addAction('Open')
quit_action = menu.addAction('Quit')
# 必须要让右键点击后的menu菜单能够一直存在(直到用户再次点击)
# 我们就必须要使用menu.exec_的方法让它一直存在
# 但是只是用这个方法的话,出现的menu菜单不是在我们的主窗口上面\
# 而是在我们的主窗口外面(而且是0, 0的位置),意思就是menu要运行,\
#但是它不知道我们主窗口运行在哪个位置,
# 所以我们要用mapToGlobal(event.pos())这个函数,将主函数里面的\
# 主窗口永真循环的exec_函数和这个联系起来,\
#这时我们获得的是事件触发(右键点击在哪里)时候的位置坐标\
# event.pos,mapToGlobal返回的是一个位置坐标,
# 同时让menu运行在这个位置,而不是默认的(0, 0)
action = menu.exec_(self.mapToGlobal(event.pos()))
if action == quit_action:
qApp.quit()
win = QApplication(sys.argv)
gui = Gui()
sys.exit(win.exec_())
运行结果:
image.png
网友评论