天天看點

PyQt5随筆:給PyQt5 界面添加右鍵菜單1.前言2.PyQt5版本 :5.15.03.建立右鍵菜單代碼分析4.完整代碼(我是UI和邏輯代碼分開的)

1.前言

一個完整的界面程式怎麼少得了右鍵菜單呢?如在浏覽器的右鍵菜單

PyQt5随筆:給PyQt5 界面添加右鍵菜單1.前言2.PyQt5版本 :5.15.03.建立右鍵菜單代碼分析4.完整代碼(我是UI和邏輯代碼分開的)

我做的右鍵菜單如下圖,其包括:圖示,選項名稱,快捷鍵

PyQt5随筆:給PyQt5 界面添加右鍵菜單1.前言2.PyQt5版本 :5.15.03.建立右鍵菜單代碼分析4.完整代碼(我是UI和邏輯代碼分開的)

圖示可以在      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美化。

如果有幫助,希望給個贊!!!