1.前言
一個完整的界面程式怎麼少得了右鍵菜單呢?如在浏覽器的右鍵菜單
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNfRHLGZkRGZkRfJ3bs92YsYTMfVmepNHLz0keOpXWE5ENNpHW4Z0MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnLxkjMxMDMwITM1AzNwAjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
我做的右鍵菜單如下圖,其包括:圖示,選項名稱,快捷鍵
圖示可以在 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美化。
如果有幫助,希望給個贊!!!