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.前言
一个完整的界面程序怎么少得了右键菜单呢?如在浏览器的右键菜单
我做的右键菜单如下图,其包括:图标,选项名称,快捷键
图标可以在 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