import sys
from PyQt5.Qt import *
# 定义菜单类
class Menu(object):
# parent 父类, indicator 信息显示, position 菜单显示位置
def __init__(self, parent, indicator, position=None):
self.parent = parent
self.indicator = indicator
self.position = position
def menu_func(self):
# 判断是按钮的菜单还是上下文菜单
if self.parent.objectName() == "push_button":
self.menu = QMenu()
self.parent.setMenu(self.menu)
elif self.parent.objectName() == "main_window":
self.menu = QMenu(self.parent)
# 菜单项
# !-----------
action_new = QAction(QIcon("logo.png"), "新建", self.menu)
self.menu.addAction(action_new)
def action_open_func():
self.indicator.setText("新建")
self.indicator.adjustSize()
# 连接点击菜单项信号和槽
action_new.triggered.connect(action_open_func)
# !-----------
action_open = QAction(QIcon("cursor.png"), "打开", self.menu)
self.menu.addAction(action_open)
def action_open_func():
self.indicator.setText("打开")
self.indicator.adjustSize()
action_open.triggered.connect(action_open_func)
# 子菜单
# !-----------
self.recent_files_submenu_func()
# 分割线
# !-----------
self.menu.addSeparator()
# !-----------
action_close = QAction(QIcon("cursor.png"), "退出", self.menu)
self.menu.addAction(action_close)
def action_open_func():
self.indicator.setText("退出")
self.indicator.adjustSize()
action_close.triggered.connect(action_open_func)
# 子菜单
def recent_files_submenu_func(self):
recent_files_submenu = QMenu(self.menu)
recent_files_submenu.setTitle("最近打开")
# !-----------
action_1 = QAction("文件1", recent_files_submenu)
recent_files_submenu.addAction(action_1)
def action_1_func():
self.indicator.setText("最近打开:文件1")
self.indicator.adjustSize()
action_1.triggered.connect(action_1_func)
# !-----------
action_2 = QAction("文件2", recent_files_submenu)
recent_files_submenu.addAction(action_2)
def action_2_func():
self.indicator.setText("最近打开:文件2")
self.indicator.adjustSize()
action_2.triggered.connect(action_2_func)
# !-----------
self.menu.addMenu(recent_files_submenu)
# 显示上下文菜单
def menu_exec_(self):
self.menu.exec_(self.position)
class Window(QWidget):
def __init__(self):
super().__init__()
self.setup_ui()
self.push_button_func()
self.context_menu_policy_radio_button_func()
self.context_menu_func()
# 重写上下文菜单事件处理方法,如果选择Qt.DefaultContextMenu,使用此策略
def contextMenuEvent(self, a0) -> None:
self.radio_button_1.setText("当前右键菜单策略:\nQt.DefaultContextMenu")
self.radio_button_1.adjustSize()
# 生成上下文菜单实例
self.right_click_menu = Menu(self, self.label, a0.globalPos())
self.right_click_menu.menu_func()
self.right_click_menu.menu_exec_()
def setup_ui(self):
self.setWindowTitle("Qt桌面应用程序")
self.setObjectName("main_window")
self.resize(300, 300)
# 定义标签,用于信息显示
self.label = QLabel("请选择功能!", self)
self.label.move(50, 50)
def context_menu_policy_radio_button_func(self):
# 定义单选框,用于选择上下文菜单策略
self.radio_button_1 = QRadioButton(self)
self.radio_button_1.move(50, 200)
self.radio_button_2 = QRadioButton(self)
self.radio_button_2.move(50, 240)
def radio_button_text():
self.radio_button_1.setText("Qt.DefaultContextMenu")
self.radio_button_1.adjustSize()
self.radio_button_2.setText("Qt.DefaultContextMenu")
self.radio_button_2.adjustSize()
radio_button_text()
# 默认选框第一个单选框
self.radio_button_1.setChecked(True)
# 判断并设置上下文菜单策略
def context_menu_policy():
if self.radio_button_1.isChecked():
self.setContextMenuPolicy(Qt.DefaultContextMenu)
radio_button_text()
elif self.radio_button_2.isChecked():
self.setContextMenuPolicy(Qt.CustomContextMenu)
radio_button_text()
# 程序运行即设置上下文菜单策略
context_menu_policy()
# 连接单选框信号与槽
self.radio_button_1.clicked.connect(context_menu_policy)
self.radio_button_2.clicked.connect(context_menu_policy)
def context_menu_func(self):
# 定义上下文菜单槽函数,
def context_menu(a0):
self.radio_button_2.setText("当前右键菜单策略:\nQt.DefaultContextMenu")
self.radio_button_2.adjustSize()
cursor_global_point = self.mapToGlobal(a0)
self.right_click_menu = Menu(self, self.label, cursor_global_point)
self.right_click_menu.menu_func()
self.right_click_menu.menu_exec_()
# 上下文菜单策略如果选择Qt.DefaultContextMenu,连接信号与槽
self.customContextMenuRequested.connect(context_menu)
def push_button_func(self):
# 定义菜单按钮
self.push_button = QPushButton(QIcon("cursor.png"), "按钮", self)
self.push_button.setObjectName("push_button")
self.push_button.move(50, 100)
# 生成按钮的菜单实例
self.push_button_menu = Menu(self.push_button, self.label)
self.push_button_menu.menu_func()
if __name__ == '__main__':
app = QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec_())