本文主要提供了两种右键创建菜单的方法,作为参考~
# -*- coding: utf-8 -*-
from PyQt5 import QtGui, QtCore
import sys
from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QMainWindow, QApplication, QMenu, QAction
class MainWindow(QMainWindow):
def __init__(self):
super(MainWindow, self).__init__()
# self.createContextMenu()
def contextMenuEvent(self, event):
menu =QMenu(self)
newAction = QAction(QIcon('create.svg'), "创建", self)
openAction = QAction(QIcon('open.svg'), "打开", self)
deleteAction = QAction(QIcon('delete.svg'), "删除", self)
newAction.triggered.connect(self.newFun)
openAction.triggered.connect(self.openFun)
deleteAction.triggered.connect(self.deleteFun)
menu.addAction(newAction)
menu.addAction(openAction)
menu.addAction(deleteAction)
menu.exec_(QtGui.QCursor().pos())
def newFun(self):
self.setWindowTitle("创建")
def openFun(self):
self.setWindowTitle("打开")
def deleteFun(self):
self.setWindowTitle("删除")
# def createContextMenu(self):
# '''''
# 创建右键菜单
# '''
# # 必须将ContextMenuPolicy设置为Qt.CustomContextMenu
# # 否则无法使用customContextMenuRequested信号
# self.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
# self.customContextMenuRequested.connect(self.showContextMenu)
#
# # 创建QMenu
# self.contextMenu = QMenu(self)
# self.actionA = self.contextMenu.addAction(u'添加')
# self.actionB = self.contextMenu.addAction(u'删除')
# # 将动作与处理函数相关联
# # 这里为了简单,将所有action与同一个处理函数相关联,
# # 当然也可以将他们分别与不同函数关联,实现不同的功能
# self.actionA.triggered.connect(self.actionHandler)
# self.actionB.triggered.connect(self.actionHandler)
#
# def showContextMenu(self, pos):
# '''''
# 右键点击时调用的函数
# '''
# # 菜单显示前,将它移动到鼠标点击的位置
# self.contextMenu.move(QtGui.QCursor().pos())
# self.contextMenu.show()
#
# def actionHandler(self):
# print('我被点击了')
if __name__ == '__main__':
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec_())
第一种方式:如文中未注释的代码,contextMenuEvent 这个方法会拦截到右键点击事件,然后在此时创建一个menu并加入对应的操作按钮即可
第二种方式:文中注释的代码,设置自定义上下文,同样是用于拦截点击事件,其他的同注释
多层级QMenu
将上述的contextMenuEvent 改为如下:
def contextMenuEvent(self, event):
menu = QMenu(self)
newAction = QAction(QIcon('create.svg'), "创建", self)
openAction = QAction(QIcon('open.svg'), "打开", self)
deleteAction = QAction(QIcon('delete.svg'), "删除", self)
newAction.triggered.connect(self.newFun)
openAction.triggered.connect(self.openFun)
deleteAction.triggered.connect(self.deleteFun)
menu.addAction(newAction)
menu.addAction(openAction)
menu.addAction(deleteAction)
menu1 = menu.addMenu(QIcon('delete.svg'), "下拉框")
newAction1 = QAction(QIcon('create.svg'), "下拉创建", self)
openAction1 = QAction(QIcon('open.svg'), "下拉打开", self)
deleteAction1 = QAction(QIcon('delete.svg'), "下拉删除", self)
menu1.addAction(newAction1)
menu1.addAction(openAction1)
menu1.addAction(deleteAction1)
menu.exec_(QtGui.QCursor().pos())
可以得到效果如下