用途:本方法将创建右键菜单做了封装。
说明:
你只要在界面初始化中调用rightkey_menu_init()函数,
后续添加gen_rightkey_menu(self,data)函数。
使用:可选多种控件类型。在控件上单击鼠标右键显示如图如下:
需要添加的代码:
class MyMainWindow(QWidget, Ui_Form):
def __init__(self, parent=None):
super(MyMainWindow, self).__init__(parent)
self.setupUi(self)
data = [
{'自选': [['自选1', '自选2'], [self.button3, self.button4],
[r'D:\tcy_icon\1.png', None], ['Ctrl+D', None]]},
['保存数据', self.button, 'image/保存.png', 'Ctrl+S'],
['删除数据', self.button_2, 'image/删除.png', None],
]
# 声明在groupBox创建右键菜单
A.rightkey_menu_init(self.groupBox,lambda :self.create_rightmenu(data))
# 创建右键菜单函数
def create_rightmenu(self,data):
A.gen_rightkey_menu(self,data)
实例:完整代码,直接运行查看效果
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Project:TcyQuantTrade
# @Module:dd
# @Author: tcy
# @Date: 2022/5/7 16:12
# @Emial: 3615693665@qq.com
# @Version: 1.18
# @Last Modified time:
# @City: China Shanghai Songjiang Xiaokunshan
# @Company: Weishi Machinery Manufacturing Priority
import os
import sys
from PyQt5.QtCore import QSettings, QDateTime, Qt
from PyQt5 import QtCore
from PyQt5.QtWidgets import QApplication, QWidget, QMenu, QAction
from PyQt5.QtGui import QCursor, QIcon
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_Form(object):
def setupUi(self, Form):
Form.setObjectName("Form")
Form.resize(362, 310)
self.groupBox = QtWidgets.QGroupBox(Form)
self.groupBox.setGeometry(QtCore.QRect(50, 40, 241, 211))
self.groupBox.setObjectName("groupBox")
self.lineEdit = QtWidgets.QLineEdit(self.groupBox)
self.lineEdit.setGeometry(QtCore.QRect(60, 70, 113, 20))
self.lineEdit.setObjectName("lineEdit")
self.pushButton = QtWidgets.QPushButton(self.groupBox)
self.pushButton.setGeometry(QtCore.QRect(30, 140, 75, 23))
self.pushButton.setObjectName("pushButton")
self.pushButton_2 = QtWidgets.QPushButton(self.groupBox)
self.pushButton_2.setGeometry(QtCore.QRect(140, 140, 75, 23))
self.pushButton_2.setObjectName("pushButton_2")
self.retranslateUi(Form)
QtCore.QMetaObject.connectSlotsByName(Form)
def retranslateUi(self, Form):
_translate = QtCore.QCoreApplication.translate
Form.setWindowTitle(_translate("Form", "Form"))
self.groupBox.setTitle(_translate("Form", "GroupBox"))
self.pushButton.setText(_translate("Form", "保存数据"))
self.pushButton_2.setText(_translate("Form", "删除数据"))
# 逻辑操作代码
# !/usr/bin/env python
# -*- coding: utf-8 -*-
# author:mgboy time:2020/7/5
# from testui import Ui_Form #
# 引用UI文件,根据调用类型选择继承窗口类型:QMainWindow,QWidget,QDialog
class A(object):
@classmethod
def rightkey_menu_init(cls,
qt_widget,
gen_rightkey_menu: 'func',
contextmenu=QtCore.Qt.CustomContextMenu):
qt_widget.setContextMenuPolicy(contextmenu) # 右键菜单self
qt_widget.customContextMenuRequested.connect(gen_rightkey_menu)
@classmethod
def gen_rightkey_menu(cls, self, data):
'''
数据:
data=[
{'自选':[['自选1','自选2'],[self.button3,self.button4],[r'D:\tcy_icon\1.png',None],['Ctrl+D',None]]},
['保存数据',self.button,'image/保存.png','Ctrl+S'],
['删除数据', self.button_2, 'image/删除.png', None],
]
右键菜单界面:
自选
自选1 r'D:\tcy_icon\1.png','Ctrl+D'
自选2 None,None
保存数据 'image/删除.png', None
删除数据 'image/保存.png','Ctrl+S'
'''
def set_menu(values, actions, menu):
name, func, icon, shortcuts_key = values
actions.append(menu.addAction(name))
if icon:
actions[-1].setIcon(QIcon(icon))
if shortcuts_key:
actions[-1].setShortcut(shortcuts_key)
menu.addAction(actions[-1])
actions[-1].triggered.connect(func)
actions, menu_ones = [], []
menu = QMenu(self)
for values in data:
if isinstance(values, dict):
for _menu_name, v in values.items():
menu_ones.append(menu.addMenu(_menu_name))
names, funcs, icons, keys = v
for name, func, icon, shortcuts_key in zip(
names, funcs, icons, keys):
set_menu([name, func, icon, shortcuts_key],
actions, menu_ones[-1])
else:
set_menu(values, actions, menu)
menu.popup(QCursor.pos())
class MyMainWindow(QWidget, Ui_Form):
def __init__(self, parent=None):
super(MyMainWindow, self).__init__(parent)
self.setupUi(self)
self.lst = [None, None]
# 按钮信号连接对象
self.pushButton.clicked.connect(self.button)
self.pushButton_2.clicked.connect(self.button_2)
data = [
{'自选': [['自选1', '自选2'], [self.button3, self.button4], [r'D:\tcy_icon\1.png', None], ['Ctrl+D', None]]},
['保存数据', self.button, 'image/保存.png', 'Ctrl+S'],
['删除数据', self.button_2, 'image/删除.png', None],
]
# 声明在groupBox创建右键菜单
A.rightkey_menu_init(
self.groupBox,
lambda: self.create_rightmenu(data))
def button(self):
print('保存数据')
def button_2(self):
print('删除数据')
def button3(self):
print('自选1')
def button4(self):
print('自选2')
# 创建右键菜单函数
def create_rightmenu(self, data):
A.gen_rightkey_menu(self, data)
if __name__ == "__main__":
# 适配2k高分辨率屏幕
QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling)
app = QApplication(sys.argv)
myWin = MyMainWindow()
myWin.show()
sys.exit(app.exec_())