pyqt 右键菜单封装

8 篇文章 2 订阅
用途:本方法将创建右键菜单做了封装。
说明:
    你只要在界面初始化中调用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_())

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值