欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

PyQt5随笔:给PyQt5 界面添加右键菜单

程序员文章站 2022-09-13 22:23:25
1.前言一个完整的界面程序怎么少得了右键菜单呢?如在浏览器的右键菜单我做的右键菜单如下图,其包括:图标,选项名称,快捷键图标可以在 https://www.iconfont.cn/collections/index?spm=a313x.7781069.1998910419.3这个阿里巴巴图标网站免费下载,下载16*16尺寸就可以2.PyQt5版本 :5.15.03.创建右键菜单代码分析3.1声明创建右键菜单#声明在groupBox创建右键菜......

1.前言

一个完整的界面程序怎么少得了右键菜单呢?如在浏览器的右键菜单

PyQt5随笔:给PyQt5 界面添加右键菜单

我做的右键菜单如下图,其包括:图标,选项名称,快捷键

PyQt5随笔:给PyQt5 界面添加右键菜单

图标可以在      https://www.iconfont.cn/collections/index?spm=a313x.7781069.1998910419.3 

这个阿里巴巴图标网站免费下载,下载16*16尺寸就可以

 

2.PyQt5版本 :5.15.0

 

3.创建右键菜单代码分析

3.1 声明创建右键菜单

#声明在groupBox创建右键菜单
self.groupBox.setContextMenuPolicy(Qt.CustomContextMenu)
self.groupBox.customContextMenuRequested.connect(self.create_rightmenu)  # 连接到菜单显示函数

这两句声明语句是必须要有的。

其中self.grounpBox 是要创建右键菜单的控件,只有在groupBox控件上右击鼠标才弹出菜单。如果是创建整个pyqt5 界面的右键菜单,用self 就可以。

self.create_rightmenu  是创建右键菜单的槽函数。虽然第一句声明了右键菜单,但其实它里面是没有内容的,槽函数就是创建右键菜单的具体内容。

其他关键字是PyQt5 创建右键菜单的关键字,如果没有把握,不能更改。

3.2 创建右键菜单槽函数

#创建右键菜单函数
    def create_rightmenu(self):
        #菜单对象
        self.groupBox_menu = QMenu(self)

        self.actionA = QAction(QIcon('image/保存.png'),u'保存数据',self)#创建菜单选项对象
        self.actionA.setShortcut('Ctrl+S')#设置动作A的快捷键
        self.groupBox_menu.addAction(self.actionA)#把动作A选项对象添加到菜单self.groupBox_menu上

        self.actionB = QAction(QIcon('image/删除.png'),u'删除数据',self)
        self.groupBox_menu.addAction(self.actionB)

        self.actionA.triggered.connect(self.button) #将动作A触发时连接到槽函数 button
        self.actionB.triggered.connect(self.button_2)

        self.groupBox_menu.popup(QCursor.pos())#声明当鼠标在groupBox控件上右击时,在鼠标位置显示右键菜单   ,exec_,popup两个都可以,

代码分析说明:一定要注意图标的位置格式,为了稳一点,可以使用绝对地址,如:D:/code_python/u3/image/保存.png (是 / 不是 \

当然,也可以不要图标 如修改对象为

self.actionA = QAction(u'保存数据',self)

4.完整代码(我是UI和逻辑代码分开的)

完整代码下载(包括图标)https://download.csdn.net/download/qq_38463737/12578710

UI py文件

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'testui.ui'
#
# Created by: PyQt5 UI code generator 5.15.0
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.


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
import sys,os

from PyQt5.QtGui import QCursor, QIcon
from PyQt5.QtWidgets import QApplication, QWidget, QMenu, QAction
from PyQt5 import QtCore
from PyQt5.QtCore import QSettings, QDateTime, Qt
from testui import Ui_Form #引用UI文件,根据调用类型选择继承窗口类型:QMainWindow,QWidget,QDialog

class MyMainWindow(QWidget, Ui_Form):#Widget界面时>>(QWidget,UI_。。),MainWindow类似
    def __init__(self, parent=None):
        super(MyMainWindow, self).__init__(parent)
        self.setupUi(self)

        #按钮信号连接对象
        self.pushButton.clicked.connect(self.button)
        self.pushButton_2.clicked.connect(self.button_2)

        #声明在groupBox创建右键菜单
        self.groupBox.setContextMenuPolicy(Qt.CustomContextMenu)
        self.groupBox.customContextMenuRequested.connect(self.create_rightmenu)  # 连接到菜单显示函数

    def button(self):
        #按钮1槽函数,进行数据保存
        print('保存数据')


    def button_2(self):
        #按钮2槽函数,删除数据
        print('删除数据')

    #创建右键菜单函数
    def create_rightmenu(self):
        #菜单对象
        self.groupBox_menu = QMenu(self)

        self.actionA = QAction(QIcon('image/保存.png'),u'保存数据',self)#self.actionA = self.contextMenu.addAction(QIcon("images/0.png"),u'|  动作A')
        self.actionA.setShortcut('Ctrl+S')#设置快捷键
        self.groupBox_menu.addAction(self.actionA)#把动作A选项添加到菜单

        self.actionB = QAction(QIcon('image/删除.png'),u'删除数据',self)
        self.groupBox_menu.addAction(self.actionB)

        self.actionA.triggered.connect(self.button) #将动作A触发时连接到槽函数 button
        self.actionB.triggered.connect(self.button_2)

        self.groupBox_menu.popup(QCursor.pos())#声明当鼠标在groupBox控件上右击时,在鼠标位置显示右键菜单   ,exec_,popup两个都可以,


if __name__ == "__main__":
    #适配2k高分辨率屏幕
    QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling)
    app = QApplication(sys.argv)
    myWin = MyMainWindow()
    myWin.show()
    sys.exit(app.exec_())

 

这样创建的菜单并不是很美观,留意我的下一篇文章对它进行QSS美化。

 

如果有帮助,希望给个赞!!!

 

 

 

 

 

 

 

本文地址:https://blog.csdn.net/qq_38463737/article/details/107137381