PyQt5按钮控件QPushButton自定义右键菜单和默认右键菜单设置
PyQt5中也是一样,但是作为开发者PyQt5给我们提供2中策略选择,分别是Qt.DefaultContextMenu默认菜单设置,需要调用对象方法contextMenuEvent()才能实现,第二种是Qt.CustomContextMenu,需要通过信号customContexMenuRequested()才能触发。
在很多软件或系统中鼠标左键起到的作用一般是选中和打开,鼠标右键都是会附加一些其他常用功能,比如压缩、新建、复制、粘贴等等。
PyQt5中也是一样,但是作为开发者PyQt5给我们提供2中策略选择,分别是Qt.DefaultContextMenu默认菜单设置,需要调用对象方法contextMenuEvent()才能实现,第二种是Qt.CustomContextMenu,需要通过信号customContexMenuRequested()才能触发。
一、默认菜单设置Qt.DefaultContextMenu
默认菜单设置需要调用QWidget中的contextMenuEvent()事件,这时候我们需要对他进行重写。contextMenuEvent()还给我们提供了鼠标点击坐标获取方法,在代码中有注释标明。
from PyQt5.Qt import * import sys class Window(QWidget): def contextMenuEvent(self, evt): # 重写contextMenuEvent方法 # QContextMenuEvent # ==============前文中创建的菜单直接拿来用=============== # 代码分割线 - 开始 menu = QMenu(self) # 创建菜单对象,self是把菜单放入到父控件(窗口)上 act = QAction() # 创建一个行为对象 act.setText('菜单选项1') # 设置菜单选项名称 act2 = QAction(QIcon('123.jpg'), '菜单选项2') # 同时设置 act3 = QAction(QIcon('123.jpg'), '菜单选项3') # 同时设置 menu.addAction(act) # 把行为放入菜单选项中 menu.addAction(act2) # 把行为2放入菜单选项中 menu.addAction(act3) # 把行为3放入菜单选项中 # ==============前文中创建的菜单直接拿来用=============== # 代码分割线 - 结束 # menu.exec_(QPoint(200, 200)) # 通过exec_()展现菜单,但是菜单位置在屏幕坐标200,200处,不符合实际需要 menu.exec_(QPoint(evt.globalPos())) # QContextMenuEvent中提供全局坐标和窗口坐标 app = QApplication(sys.argv) window = Window() window.setWindowTitle('QPushButton右键菜单设置 - PyQt5中文网') window.resize(600, 450) btn1 = QPushButton(window) btn1.move(80, 60) btn1.resize(80, 40) btn1.setText('按钮1') btn1.setAutoDefault(True) window.show() sys.exit(app.exec_())
这里最需要大家注意的就是坐标问题,一定要弄清楚什么是全局坐标和窗口坐标。
二、自定义菜单设置Qt.CustomContextMenu
Qt.CustomContextMenu需要通过信号customContexMenuRequested()才能触发。
from PyQt5.Qt import * import sys app = QApplication(sys.argv) window = QWidget() window.setWindowTitle('QPushButton右键菜单设置 - PyQt5中文网') window.resize(600, 450) window.setContextMenuPolicy(Qt.CustomContextMenu) # 先设置好菜单出发策略为自定义菜单 def show_menu(point): # 为customContextMenuRequested信号创建一个槽函数,传入一个坐标点留用 # ==============前文中创建的菜单直接拿来用=============== # 代码分割线 - 开始 menu = QMenu(window) # 创建菜单对象,self是把菜单放入到父控件(窗口)上 act = QAction() # 创建一个行为对象 act.setText('菜单选项1') # 设置菜单选项名称 act2 = QAction(QIcon('123.jpg'), '菜单选项2') # 同时设置 act3 = QAction(QIcon('123.jpg'), '菜单选项3') # 同时设置 menu.addAction(act) # 把行为放入菜单选项中 menu.addAction(act2) # 把行为2放入菜单选项中 menu.addAction(act3) # 把行为3放入菜单选项中 # ==============前文中创建的菜单直接拿来用=============== # 代码分割线 - 结束 # 注意这里菜单的展现方法和默认菜单策略不一样了 # menu.exec_(point) # 这里传入的是桌面界面坐标点 glb_point = window.mapToGlobal(point) # 通过mapToGlobal方法进行映射到界面坐标 menu.exec_(glb_point) window.customContextMenuRequested.connect(show_menu) btn1 = QPushButton(window) btn1.move(80, 60) btn1.resize(80, 40) btn1.setText('按钮1') btn1.setAutoDefault(True) window.show() sys.exit(app.exec_())
以上2中方法都是完整代码,效果截图无法生动演示,自己复制即可。注意观看注释文字。