Python GUI编程网 > PyQt5控件_PyQt5控件方法大全 > PyQt5按钮控件QPushButton自定义右键菜单和默认右键菜单设置
python教程

PyQt5按钮控件QPushButton自定义右键菜单和默认右键菜单设置

发布博客:2022年11月17日 01:35
阅读:217
作者:Python GUI编程网

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中方法都是完整代码,效果截图无法生动演示,自己复制即可。注意观看注释文字。