如何在 PyQt5 的上下文菜单中添加上下文菜单?

     2023-02-17     14

关键词:

【中文标题】如何在 PyQt5 的上下文菜单中添加上下文菜单?【英文标题】:How to add a context menu to a context menu in PyQt5? 【发布时间】:2021-01-31 00:16:56 【问题描述】:

我正在使用 PyQt5 在 python 中构建一个 GUI,我需要当我右键单击上下文菜单中的一个选项时,它会显示另一个上下文菜单,如图所示...

(我知道我可以在其中一个选项中嵌套一个菜单,但这不是我想要的)

上下文菜单不区分右键单击和左键单击。

我认为要实现这一目标有两个问题...

    不知道怎么防止右键触发PyQt5.QtWidgets.QAction。 第二个问题是创建上下文菜单所涉及的步骤之一通常是在小部件上使用.installEventFilter() 方法,但在这种情况下,您应该在PyQt5.QtWidgets.QAction 类型的对象上使用它

我知道我要实现的目标很复杂,但如果您能给我一些信息来帮助我实现它,我将不胜感激。

在这里,我给你留下一个 GUI 的代码,它带有一个安装了上下文菜单的小部件......

from PyQt5 import QtWidgets
from PyQt5.QtWidgets import QApplication, QMainWindow, QMenu
import sys
from PyQt5.QtCore import QEvent


class MyWindow(QMainWindow):
    def __init__(self):
        super(MyWindow, self).__init__()
        self.createWidgets()

    def createWidgets(self):
        self.my_button = QtWidgets.QPushButton(self)
        self.my_button.setText("My Widget")
        self.my_button.installEventFilter(self)

    def eventFilter(self, source, event):
        if event.type() == QEvent.ContextMenu and source is self.my_button:
            menu = QMenu()

            action1 = menu.addAction("Option 1")
            action2 = menu.addAction("Option 2")
            action3 = menu.addAction("Option 3")

            selected_action = menu.exec_(event.globalPos())

            if selected_action == action1:
                print("You have selected the first option")
            if selected_action == action2:
                print("You have selected the second option")
            if selected_action == action3:
                print("You have selected the third option")

        return super().eventFilter(source, event)




def showWindow():
    app = QApplication(sys.argv)
    window = MyWindow()
    window.show()
    sys.exit(app.exec_())

showWindow()

【问题讨论】:

【参考方案1】:

在按钮上安装事件过滤器是不够的,你当然不能在QAction上安装它,它永远不会触发鼠标事件,因为它不是从QWidget继承的。您必须在菜单本身上安装过滤器。

为了允许正确跟踪菜单(并对它们的事件做出正确反应),最好也保留对菜单的更多静态引用。

显然,您可以创建 QMenu 的子类,这可能会使事情变得更容易。

class MyWindow(QMainWindow):
    def __init__(self):
        super(MyWindow, self).__init__()
        self.createWidgets()

    def createWidgets(self):
        self.my_button = QtWidgets.QPushButton(self)
        self.my_button.setText("My Widget")

        self.buttonMenu = QMenu(self.my_button)
        self.buttonMenu.addAction("Option 1")
        self.buttonMenu.addAction("Option 2")
        self.buttonMenu.addAction("Option 3")

        self.subMenu = QMenu(self.buttonMenu)
        self.subMenu.addAction("Sub Option 1")
        self.subMenu.addAction("Sub Option 2")
        self.subMenu.addAction("Sub Option 3")

        self.my_button.installEventFilter(self)
        self.buttonMenu.installEventFilter(self)

    def eventFilter(self, source, event):
        if event.type() == QEvent.ContextMenu:
            if source == self.my_button:
                self.buttonMenu.exec_(event.globalPos())
                return True
            elif source == self.buttonMenu:
                self.subMenu.exec_(event.globalPos())
                return True

        return super().eventFilter(source, event)

【讨论】:

如何在 iMessage 文本选择上下文菜单中添加自定义操作?

】如何在iMessage文本选择上下文菜单中添加自定义操作?【英文标题】:HowtoaddcustomactioniniMessagetextselectioncontextmenu?【发布时间】:2020-07-2519:33:20【问题描述】:我知道如何在我的应用程序的文本字段/文本视图中添加文本选择菜... 查看详情

如何在上下文菜单中添加“新建”Python 脚本选项?

】如何在上下文菜单中添加“新建”Python脚本选项?【英文标题】:HowdoIadda"New"Pythonscriptoptiontothecontextmenu?【发布时间】:2013-11-1412:35:28【问题描述】:我正在尝试在Windows7上为New->PythonScript添加上下文菜单选项。但是... 查看详情

PyQt5 QTableWidget:右键选择列,并在上下文菜单中显示删除条目

】PyQt5QTableWidget:右键选择列,并在上下文菜单中显示删除条目【英文标题】:PyQt5QTableWidget:selectcolumnwithrightclick,andshowadeleteentryincontextmenu【发布时间】:2019-02-2106:41:12【问题描述】:我想在右键单击时选择一列,然后上下文菜... 查看详情

PyQt5:如何从系统托盘图标上下文菜单启动窗口?

】PyQt5:如何从系统托盘图标上下文菜单启动窗口?【英文标题】:PyQt5:howdoIlaunchawindowfromasystemtrayiconcontextmenu?【发布时间】:2018-11-2416:26:07【问题描述】:我有两个单独的文件,一个用于创建系统托盘图标和上下文菜单,另一... 查看详情

如何在 MV3 Chrome 扩展弹出图标中添加上下文菜单?

】如何在MV3Chrome扩展弹出图标中添加上下文菜单?【英文标题】:HowdoIaddcontextmenuinMV3Chromeextensionpopupicon?【发布时间】:2021-12-2317:08:12【问题描述】:我想在我的弹出图标内容菜单中添加“在FB/Twitter和Facebook页面上分享”链接。... 查看详情

使用 PyQt5 创建上下文菜单

】使用PyQt5创建上下文菜单【英文标题】:CreateacontextmenuwithPyQt5【发布时间】:2020-12-1915:01:02【问题描述】:我正在尝试制作一个上下文菜单,但我看到了一些他们在其中编写下一个代码的tuts,例如:importsysfromPyQt5.QtWidgetsimportQM... 查看详情

将项目添加到 Eclipse 文本查看器上下文菜单

】将项目添加到Eclipse文本查看器上下文菜单【英文标题】:AddingitemtoEclipsetextviewercontextmenu【发布时间】:2010-12-1406:20:23【问题描述】:我正在为Eclipse开发一个插件。在这个插件中,我需要能够在文本编辑器的上下文菜单中添加... 查看详情

如何在 Windows 11 的 Windows 资源管理器中添加“Git Bash Here”上下文菜单选项?

】如何在Windows11的Windows资源管理器中添加“GitBashHere”上下文菜单选项?【英文标题】:Howtoadda"GitBashHere"contextmenuoptiontothewindowsexplorerinWindows11?【发布时间】:2022-01-1104:52:04【问题描述】:我最近切换到Windows11,安装git后... 查看详情

如何将上下文菜单添加到 ListBoxItem?

】如何将上下文菜单添加到ListBoxItem?【英文标题】:HowcanIaddacontextmenutoaListBoxItem?【发布时间】:2010-09-2711:24:09【问题描述】:我有一个ListBox,我想为列表中的每个项目添加一个上下文菜单。我已经看到“解决方案”可以右键... 查看详情

如何在 Windows 资源管理器中添加“在此处打开 git-bash ...”上下文菜单?

】如何在Windows资源管理器中添加“在此处打开git-bash...”上下文菜单?【英文标题】:Howtoadda"opengit-bashhere..."contextmenutothewindowsexplorer?【发布时间】:2014-08-1417:12:39【问题描述】:如何在Windows资源管理器中添加上下文(... 查看详情

向多个活动添加相同的上下文菜单

】向多个活动添加相同的上下文菜单【英文标题】:Addingthesamecontextmenutomultipleactivities【发布时间】:2011-06-2102:46:39【问题描述】:我试图弄清楚如何在多个活动中包含常见的代码。更具体地说,我有一个上下文菜单,我想将它... 查看详情

如何将项目添加到 UWP 应用程序的资源管理器上下文菜单

】如何将项目添加到UWP应用程序的资源管理器上下文菜单【英文标题】:HowtoaddanitemtoexplorercontextmenuforUWPapplication【发布时间】:2019-10-0210:34:21【问题描述】:我已使用DesktopAppConverter将我的WPF应用程序转换为appx包。我需要在资源... 查看详情

将上下文菜单添加到特定的 Qtablewdiget 表列,Python

】将上下文菜单添加到特定的Qtablewdiget表列,Python【英文标题】:AddcontextmenutoaspecificQtablewdigettablecolumn,Python【发布时间】:2019-10-2907:21:07【问题描述】:我正在尝试使用pyQt5将数据填充到我的Qtablewdiget。最重要的是,我想在我的... 查看详情

如何在gridView中显示某行的上下文菜单

】如何在gridView中显示某行的上下文菜单【英文标题】:HowtoShowContextMenuforsomerowingridView【发布时间】:2012-05-0321:24:50【问题描述】:我有一个绑定到数据表的网格视图。我想为有条件的行添加上下文。我在RowDataBound事件中使用此... 查看详情

如何使用 VSCode 扩展添加上下文菜单?

】如何使用VSCode扩展添加上下文菜单?【英文标题】:HowtoaddcontextmenuwithVSCodeextension?【发布时间】:2017-05-1423:50:36【问题描述】:如何添加上下文菜单?(在资源管理器和/或编辑器中)我尝试了以下不起作用:"command":"extension.sa... 查看详情

无法使用 Cocoa 中的服务在 Finder 的上下文菜单中添加项目

】无法使用Cocoa中的服务在Finder的上下文菜单中添加项目【英文标题】:UnabletoadditeminFinder\'scontextualmenuusingservicesinCocoa【发布时间】:2012-02-2411:45:53【问题描述】:每当我右键单击文件或文件夹时,我想在Finder的上下文菜单中添... 查看详情

上下文菜单未使用 PyQt5 显示正确的语言

】上下文菜单未使用PyQt5显示正确的语言【英文标题】:ContextMenunotdisplayingcorrectlanguagewithPyQt5【发布时间】:2018-01-0820:46:01【问题描述】:当我尝试使用PyQt5创建Qt应用程序时,我注意到QPlainTextEdit标准上下文菜单以English显示,这... 查看详情

Intellij:在项目窗格中的上下文菜单中添加“接口”

】Intellij:在项目窗格中的上下文菜单中添加“接口”【英文标题】:Intellij:Adding\'Interface\'tomycontextmenuintheProjectPane【发布时间】:2011-03-2401:11:31【问题描述】:目前在IntelliJ中,如果我在Project窗格中右键单击一个包,我可以看... 查看详情