? 在PyQt中,可以通过QMenu
和QAction
类来创建和管理菜单。QMenu
用于定义具体的菜单,而QAction
则代表菜单中的具体操作项。
API
QPushButton操作菜单的相关Api
QMenu自身相关Api
代码演示
from PyQt5.Qt import *
import sys
app = QApplication(sys.argv)
window = QWidget()
window.setWindowTitle("测试按钮菜单")
window.resize(500, 500)
btn = QPushButton()
btn.setParent(window)
btn.setText("测试菜单按钮")
btn.setIcon(QIcon("菜单.png"))
# *************菜单的设置***************开始
# 创建一个菜单实例,该菜单将与按钮关联
menu = QMenu(window)
# 创建一个新的 QAction 实例,代表"新建"操作
new_action = QAction(QIcon("新建.png"), "新建", menu)
new_action.triggered.connect(lambda :print("新建文件"))
open_action = QAction(QIcon("打开.png"), "打开", menu)
open_action.triggered.connect(lambda :print("打开文件"))
exit_action = QAction("退出", menu)
exit_action.triggered.connect(lambda :print("退出程序"))
# 创建一个子菜单实例,用于存储最近打开的文件
open_recent_menu = QMenu(menu)
# 设置子菜单的标题
open_recent_menu.setTitle("最近打开")
# 创建一个新的 QAction 实例,代表"最近的文件"
file_action = QAction("最近的文件")
# 将各个操作添加到菜单中
menu.addAction(new_action)
menu.addAction(open_action)
open_recent_menu.addAction(file_action)
# 将子菜单添加到主菜单中
menu.addMenu(open_recent_menu)
# 添加一个分隔线,以区分不同的操作组
menu.addSeparator()
menu.addAction(exit_action)
# 将菜单设置为按钮的关联菜单
btn.setMenu(menu)
# *************菜单的设置***************结束
window.show()
sys.exit(app.exec_())
结果:
API
右键事件继承自 QWidget,Api如下图所示:
如图所示,右键菜单有两种方式:
继承QWidget,重写 contextMenuEvent 方法,在方法中实现menu的创建即可;
控件类设置右键菜单策略为自定义:
your_window.setContextMenuPolicy(Qt.CustomContextMenu)
然后定义上下文菜单的请求信号槽函数,在槽函数中创建菜单:
your_window.customContextMenuRequested.connect(your_slot)
代码演示
方式一,继承QWidget,重写 contextMenuEvent 方法,代码:
from PyQt5.Qt import *
import sys
class Window(QWidget):
def contextMenuEvent(self, event) -> None:
print("上下文菜单调用方法")
# *************菜单的设置***************开始
# 创建一个菜单实例,该菜单将与按钮关联
menu = QMenu(window)
# 创建一个新的 QAction 实例,代表"新建"操作
new_action = QAction(QIcon("新建.png"), "新建", menu)
new_action.triggered.connect(lambda: print("新建文件"))
open_action = QAction(QIcon("打开.png"), "打开", menu)
open_action.triggered.connect(lambda: print("打开文件"))
exit_action = QAction("退出", menu)
exit_action.triggered.connect(lambda: print("退出程序"))
# 创建一个子菜单实例,用于存储最近打开的文件
open_recent_menu = QMenu(menu)
# 设置子菜单的标题
open_recent_menu.setTitle("最近打开")
# 创建一个新的 QAction 实例,代表"最近的文件"
file_action = QAction("最近的文件")
# 将各个操作添加到菜单中
menu.addAction(new_action)
menu.addAction(open_action)
open_recent_menu.addAction(file_action)
# 将子菜单添加到主菜单中
menu.addMenu(open_recent_menu)
# 添加一个分隔线,以区分不同的操作组
menu.addSeparator()
menu.addAction(exit_action)
# 在鼠标点击的位置显示菜单
menu.exec_(event.globalPos())
# *************菜单的设置***************结束
app = QApplication(sys.argv)
window = Window()
window.setWindowTitle("测试右键菜单")
window.resize(500, 500)
window.show()
sys.exit(app.exec_())
方式二,控件类设置右键菜单策略为自定义,代码:
from PyQt5.Qt import *
import sys
def get_menu(point) -> None:
print("上下文菜单调用方法")
# *************菜单的设置***************开始
# 创建一个菜单实例,该菜单将与按钮关联
menu = QMenu(window)
# 创建一个新的 QAction 实例,代表"新建"操作
new_action = QAction(QIcon("新建.png"), "新建", menu)
new_action.triggered.connect(lambda: print("新建文件"))
open_action = QAction(QIcon("打开.png"), "打开", menu)
open_action.triggered.connect(lambda: print("打开文件"))
exit_action = QAction("退出", menu)
exit_action.triggered.connect(lambda: print("退出程序"))
# 创建一个子菜单实例,用于存储最近打开的文件
open_recent_menu = QMenu(menu)
# 设置子菜单的标题
open_recent_menu.setTitle("最近打开")
# 创建一个新的 QAction 实例,代表"最近的文件"
file_action = QAction("最近的文件")
# 将各个操作添加到菜单中
menu.addAction(new_action)
menu.addAction(open_action)
open_recent_menu.addAction(file_action)
# 将子菜单添加到主菜单中
menu.addMenu(open_recent_menu)
# 添加一个分隔线,以区分不同的操作组
menu.addSeparator()
menu.addAction(exit_action)
# 在全局坐标系下转换点的位置并显示菜单
dest_point = window.mapToGlobal(point) #point是相对桌面的绝对位置,转换为相对父控件的位置
menu.exec_(dest_point)
# *************菜单的设置***************结束
app = QApplication(sys.argv)
window = QWidget()
window.setWindowTitle("测试右键菜单")
window.resize(500, 500)
# 设置窗口的上下文菜单策略为自定义,并连接自定义右键菜单请求信号到处理函数
window.setContextMenuPolicy(Qt.CustomContextMenu)
window.customContextMenuRequested.connect(get_menu) #传入一个相对桌面的绝对位置
window.show()
sys.exit(app.exec_())
注意:customContextMenuRequested会给槽函数传入一个相对桌面的绝对位置,需要在槽函数中转换为相对父控件的位置再进行使用。
结果
? 注意掌握菜单的创建 和 action 的添加,以及 按钮点击显示菜单 和 右键显示菜单 的两种方式。