PyQt5 右键菜单Context Menu 弹出的方法

右键菜单Context Menu 弹出的方法

python 官网相关介绍 https://wiki.python.org/moin/PyQt/Handling context menus

方法一
子类化控件,重新实现 contextMenuEvent() 方法

$ cat subclass2_1.py 
#!/usr/bin/env python
# coding=utf-8
import os
import sys
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
import sip
 
 
class MyWindow(QDialog):
 
    def __init__(self, parent=None):
        super(MyWindow, self).__init__(parent)
        self.layout = QVBoxLayout()
        self.widget1 = QListWidget()
        self.widget1.setWindowTitle('aaaaaa')
        self.layout.addWidget(self.widget1)
        self.widget1.resize(300,200)
        self.widget2 = QListWidget()
        self.widget2.setWindowTitle('bbbbbb')
        self.widget2.resize(300,200)
        self.layout.addWidget(self.widget2)
        self._diyWindow = DiyWindow()
        self.layout.addWidget(self._diyWindow)
        self.setLayout(self.layout)
        #self.resize(300,200)
class DiyWindow(QDialog):
    def __init__(self, parent=None):
        super(DiyWindow, self).__init__(parent)
        self.layout = QVBoxLayout()
        self.widget = QListWidget()
        self.layout.addWidget(self.widget)
        self.setLayout(self.layout)
        self.widget.resize(300,200)
    # 当按右键的时候,这个event会被触发
    def contextMenuEvent(self, event):
 
        menu = QMenu(self)
        quitAction = menu.addAction("Quit")
        action = menu.exec_(self.mapToGlobal(event.pos()))
        if action == quitAction:
            qApp.quit()
 
if __name__ == "__main__":
    app = QApplication(sys.argv)
    win = MyWindow()
    win.show()
    sys.exit(app.exec_())

run 一下,看运行的结果,按照上面的代码,只有第三个框内点击右键,才会弹出菜单栏,所以实际上我们可以把这个功能实现在不同的区域。
在这里插入图片描述
注意一下:
exec():
显示一个模式对话框,并且锁住程序直到用户关闭该对话框为止。函数返回一个DialogCode结果。
在对话框弹出期间,用户不可以切换同程序下的其它窗口,直到该对话框被关闭。
原文:Shows the dialog as a modal dialog, blocking until the user closes it. The function returns a DialogCode result.
Users cannot interact with any other window in the same application until they close the dialog.
父类实例化子类 直接用.show()方法闪退, 所以要实例化为父类的全局变量 or 执行exec_() 方法

来源
作者:刘月玮
链接:https://www.jianshu.com/p/dade4bea67b2

方法二

对 widget 添加actions, 把 context menu policy 设成 ActionsContextMenu.

$ cat actions2.py 
#!/usr/bin/env python
# coding=utf-8
import os
import sys
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *

import sip
 
 
class MyWindow(QDialog):
 
    def __init__(self, parent=None):
        super(MyWindow, self).__init__(parent)
        self.layout = QVBoxLayout()
        self.widget = QListWidget()
        self.layout.addWidget(self.widget)
        self.setLayout(self.layout)
        self.resize(300,200)
         
        self.setContextMenuPolicy(Qt.ActionsContextMenu) #Qt 
        # 直接把action加到自身上
        quitAction = QAction("Quit", self)
        quitAction.triggered.connect(qApp.quit)
        self.addAction(quitAction)
 
if __name__ == "__main__":
    app = QApplication(sys.argv)
    win = MyWindow()
    win.show()
    sys.exit(app.exec_())

右键后弹出 action
在这里插入图片描述

方法三
自定义弹出菜单

重设右键并绑定信号槽

$ cat menubar1.py 
#!/usr/bin/env python
# coding=utf-8
import sys
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
#from PyQt5 import QtWidgets

class MenuDemo(QMainWindow):
    def __init__(self,parent=None):
        super(MenuDemo, self).__init__(parent)

        self.menuBar1 = self.menuBar()
        self.menuBar1.setGeometry(QRect(0, 0, 606, 26))
        self.menuBar1.setObjectName("menuBar")
        self.menuBar1.addMenu('File')

        self.setContextMenuPolicy(Qt.CustomContextMenu)
        self.customContextMenuRequested['QPoint'].connect(self.rightMenuShow)

    def rightMenuShow(self):
        rightMenu = QMenu(self.menuBar1)
        
        self.actionreboot = QAction('zhangji')
        self.actionreboot.setObjectName("actionreboot")
        self.actionreboot.setText(QCoreApplication.translate("MainWindow", "重新开机"))
        rightMenu.addAction(self.actionreboot)
        
        rightMenu.exec_(QCursor.pos())

if __name__ == '__main__':
    app=QApplication(sys.argv)
    demo=MenuDemo()
    demo.show()
    sys.exit(app.exec_())

run一下
在这里插入图片描述
再看一个例子

#!/usr/bin/env python
# coding=utf-8
import os
import sys
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
import sip
 
 
class MyWindow(QDialog):
 
    def __init__(self, parent=None):
        super(MyWindow, self).__init__(parent)
        self.layout = QVBoxLayout()
        self.widget = QListWidget()
        self.layout.addWidget(self.widget)
        self.setLayout(self.layout)
        self.resize(300, 200)
 
        self.widget.setContextMenuPolicy(Qt.CustomContextMenu)
        self.widget.customContextMenuRequested.connect(self.openMenu)
 
    def openMenu(self, position):
 
        menu = QMenu()
        quitAction = menu.addAction("Quit")
        action = menu.exec_(self.widget.mapToGlobal(position))
        if action == quitAction:
            qApp.quit()
 
if __name__ == "__main__":
    app = QApplication(sys.argv)
    win = MyWindow()
    win.show()
    sys.exit(app.exec_())

在这里插入图片描述
其他相关的程序,也可以这样设置
在这里插入图片描述

  • 9
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PyQt5中,可以使用QMenu和QContextMenuEvent来创建菜单。下面是一个示例代码,展示了如何在QWidget上创建一个简单的菜单: ```python from PyQt5.QtWidgets import QApplication, QMainWindow, QMenu, QAction, QWidget from PyQt5.QtCore import Qt class MyWidget(QWidget): def __init__(self): super().__init__() self.init_ui() def init_ui(self): self.setGeometry(100, 100, 300, 200) def contextMenuEvent(self, event): # 创建菜单 menu = QMenu(self) # 创建菜单项 action1 = QAction("菜单项1", self) action2 = QAction("菜单项2", self) action3 = QAction("菜单项3", self) # 添加菜单项到菜单 menu.addAction(action1) menu.addAction(action2) menu.addAction(action3) # 在鼠标位置显示菜单 menu.exec_(self.mapToGlobal(event.pos())) if __name__ == "__main__": app = QApplication([]) window = QMainWindow() widget = MyWidget() window.setCentralWidget(widget) window.show() app.exec_() ``` 在这个示例中,我们创建了一个继承自QWidget的自定义小部件MyWidget。在MyWidget中,我们重写了contextMenuEvent方法,并在其中创建了一个菜单菜单中添加了三个菜单项:菜单项1、菜单项2和菜单项3。当用户在MyWidget上击时,会触发contextMenuEvent方法,并在鼠标位置显示菜单。 你可以根据需要在每个菜单项的信号槽中执行自定义的操作,例如打开对话框、执行特定的功能等。 请注意,你可能需要根据你的实际需求对代码进行进一步调整和修改。这个示例提供了一个基本的框架,以帮助你开始在PyQt5中创建菜单

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值