PyQT(PySide)的上下文菜单策略设置setContextMenuPolicy()

news/2025/3/3 7:04:00/

        在 Qt 中,QWidget 类提供了几种不同的上下文菜单策略,这些策略通过 Qt::ContextMenuPolicy 枚举类型来定义,用于控制控件(如按钮、文本框等)在用户右键点击时如何显示上下文菜单。

        以下是 Qt::ContextMenuPolicy 枚举中定义的所有上下文菜单策略:

1. Qt::DefaultContextMenu

  • 含义:使用默认的上下文菜单处理方式。对于大多数控件,这通常意味着当用户右键点击时,会根据操作系统和控件的默认行为显示一个上下文菜单。
  • 示例代码
import sysfrom PySide6.QtCore import Qt
from PySide6.QtWidgets import QApplication, QWidget, QLineEditapp = QApplication(sys.argv)
window = QWidget()line_edit = QLineEdit("DefaultContextMenu", window)
line_edit.setContextMenuPolicy(Qt.DefaultContextMenu)window.show()
sys.exit(app.exec())

• 当单击鼠标右键,弹出默认的菜单。

2. Qt::NoContextMenu

  • 含义:控件不会显示上下文菜单。当用户在该控件上右键点击时,不会触发任何与上下文菜单相关的操作。注意:该策略只是简单地让控件自身不显示上下文菜单,但当用户在这个控件上触发上下文菜单事件(通常是右键点击)时,这个事件会继续向其父控件传播。如果父控件有相应的上下文菜单处理逻辑,那么父控件的上下文菜单可能会显示出来。
  • 示例代码
import sysfrom PySide6.QtCore import Qt
from PySide6.QtWidgets import QApplication, QWidget, QLineEditapp = QApplication(sys.argv)
window = QWidget()line_edit = QLineEdit("No Context Menu", window)
line_edit.setContextMenuPolicy(Qt.NoContextMenu)window.show()
sys.exit(app.exec())

3. Qt::PreventContextMenu

  • 含义:阻止上下文菜单的显示,并且不会向父控件传播上下文菜单事件。这意味着即使父控件有上下文菜单处理逻辑,也不会被触发。
  • 示例代码
import sysfrom PySide6.QtCore import Qt
from PySide6.QtGui import QAction
from PySide6.QtWidgets import QApplication, QWidget, QLineEdit, QMenuapp = QApplication(sys.argv)class MyWindow(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):self.setWindowTitle("上下文菜单")self.resize(300, 200)# 重写上下文菜单事件def contextMenuEvent(self, event):# 创建一个菜单menu = QMenu(self)# 创建菜单项action1 = QAction("菜单项1", self)action2 = QAction("菜单项2", self)# 将菜单项添加到菜单中menu.addAction(action1)menu.addAction(action2)# 在鼠标点击的位置显示菜单menu.exec(event.globalPos())window = MyWindow()
line_edit = QLineEdit("PreventContextMenu", window)
line_edit.setContextMenuPolicy(Qt.PreventContextMenu)window.show()
sys.exit(app.exec())

        这个范例中,由于line_edit设置了PreventContextMenu策略,虽然它的父容器定义了菜单,但是阻止了向父控件传播上下文菜单事件,所以点击它没有任何菜单显示。

如果将上述代码修改为DefaultContextMenu策略:

import sysfrom PySide6.QtCore import Qt
from PySide6.QtGui import QAction
from PySide6.QtWidgets import QApplication, QWidget, QLineEdit, QMenuapp = QApplication(sys.argv)class MyWindow(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):self.setWindowTitle("上下文菜单")self.resize(300, 200)# 重写上下文菜单事件def contextMenuEvent(self, event):# 创建一个菜单menu = QMenu(self)# 创建菜单项action1 = QAction("菜单项1", self)action2 = QAction("菜单项2", self)# 将菜单项添加到菜单中menu.addAction(action1)menu.addAction(action2)# 在鼠标点击的位置显示菜单menu.exec(event.globalPos())window = MyWindow()
line_edit = QLineEdit("PreventContextMenu", window)
line_edit.setContextMenuPolicy(Qt.DefaultContextMenu)window.show()
sys.exit(app.exec())

它就会显示自己的默认菜单。

 或者设置为NoContextMenu策略:

import sysfrom PySide6.QtCore import Qt
from PySide6.QtGui import QAction
from PySide6.QtWidgets import QApplication, QWidget, QLineEdit, QMenuapp = QApplication(sys.argv)class MyWindow(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):self.setWindowTitle("上下文菜单")self.resize(300, 200)# 重写上下文菜单事件def contextMenuEvent(self, event):# 创建一个菜单menu = QMenu(self)# 创建菜单项action1 = QAction("菜单项1", self)action2 = QAction("菜单项2", self)# 将菜单项添加到菜单中menu.addAction(action1)menu.addAction(action2)# 在鼠标点击的位置显示菜单menu.exec(event.globalPos())window = MyWindow()
line_edit = QLineEdit("PreventContextMenu", window)
line_edit.setContextMenuPolicy(Qt.NoContextMenu)window.show()
sys.exit(app.exec())

 点击后自己的菜单不显示,但是将点击事件传递给了父容器,所以会显示父容器的菜单:

4. Qt::ActionsContextMenu

  • 含义:控件的上下文菜单由其 actions() 方法返回的动作列表组成。可以通过向控件添加动作(QAction)来定义上下文菜单的选项。
  • 示例代码
import sysfrom PySide6.QtCore import Qt
from PySide6.QtGui import QAction
from PySide6.QtWidgets import QApplication, QWidget, QPushButton, QLineEditapp = QApplication(sys.argv)
window = QWidget()class MyLineEdit(QLineEdit):def __init__(self, parent=None):super().__init__(parent)self.setupUi(self)def setupUi(self, parent):self.setText("PreventContextMenu")self.setContextMenuPolicy(Qt.ActionsContextMenu)     # 设置上下文菜单策略action = QAction("Action 1", self)self.addAction(action)   # 创建的时候已经有了Action 1菜单项line_edit = MyLineEdit(window)action = QAction("Action 2", line_edit)
line_edit.addAction(action)   # 再添加一个Action 2菜单项window.show()
sys.exit(app.exec())

进一步的,我们可以读取控件的系统内置默认菜单,并且再后面加上自定义的菜单项:

import sysfrom PySide6.QtCore import Qt
from PySide6.QtGui import QAction
from PySide6.QtWidgets import QApplication, QWidget, QPushButton, QLineEditapp = QApplication(sys.argv)
window = QWidget()class MyLineEdit(QLineEdit):def __init__(self, parent=None):super().__init__(parent)self.setupUi(self)def setupUi(self, parent):self.setText("ActionsContextMenu")self.setContextMenuPolicy(Qt.ActionsContextMenu)     # 设置上下文菜单策略default_actions = self.createStandardContextMenu().actions()   # 获取系统默认的上下文菜单self.addActions(default_actions)   # 添加系统默认的上下文菜单action = QAction("Action 1", self)   # 创建一个Action 1菜单项self.addAction(action)   # 添加Action 1菜单项line_edit = MyLineEdit(window)action = QAction("Action 2", line_edit)
line_edit.addAction(action)   # 再添加一个Action 2菜单项window.show()
sys.exit(app.exec())

5. Qt::CustomContextMenu

  • 含义:自定义上下文菜单。
            当用户在控件上右键点击时,会发出 customContextMenuRequested 信号,开发者可以连接这个信号到自定义的槽函数,在槽函数中创建并显示自定义的上下文菜单。
  • 示例代码
import sysfrom PySide6.QtCore import Qt
from PySide6.QtWidgets import QApplication, QWidget, QMenu, QLineEditapp = QApplication(sys.argv)
window = QWidget()line_edit = QLineEdit("PreventContextMenu", window)
line_edit.setContextMenuPolicy(Qt.CustomContextMenu)   # 设置上下文菜单策略# 槽函数
def show_context_menu(pos):menu = QMenu(line_edit)menu.addAction("Custom Action")menu.exec(line_edit.mapToGlobal(pos))line_edit.customContextMenuRequested.connect(show_context_menu)   # 连接信号和槽window.show()
sys.exit(app.exec())

除了策略设置setContextMenuPolicy()的方法,还可以使用另一种方法:

通过重新定义contextMenuEvent() 的方法来定义右键菜单

PySide(PyQT)重新定义contextMenuEvent()实现鼠标右键弹出菜单-CSDN博客


http://www.ppmy.cn/news/1576229.html

相关文章

PyCharm怎么集成DeepSeek

PyCharm怎么集成DeepSeek 在PyCharm中集成DeepSeek等大语言模型(LLM)可以借助一些插件或通过代码调用API的方式实现,以下为你详细介绍两种方法: 方法一:使用JetBrains AI插件(若支持DeepSeek) JetBrains推出了AI插件来集成大语言模型,不过截至2024年7月,官方插件主要…

LLMs之DeepSeek:DeepSeek-V3/R1推理系统的架构设计和性能统计的简介、细节分析之详细攻略

LLMs之DeepSeek:DeepSeek-V3/R1推理系统的架构设计和性能统计的简介、细节分析之详细攻略 目录 DeepSeek-V3/R1推理系统的架构设计 1、大规模跨节点专家并行 (EP) 2、计算-通信重叠 3、负载均衡 4、在线推理系统图 DeepSeek-V3/R1推理系统的架构设计 2025年3月…

compose multiplatform写一个简单的阅读器2

目录 解码全部换成mupdf 遇到的一些问题 相对上一篇文章修正的内容: 使用感受: 未来可能要完成的功能: 解码全部换成mupdf android里面的pdf解析,背景没有了,换了mupdf就正常了. 解码的代码统一,省的麻烦了. mupdf不只支持pdf,还支持epub/mobi这些,这在桌面端没有找到一…

通过返回的key值匹配字典中的value值

需求 页面中上面搜索项有获取字典枚举接口,table表格中也有根据key匹配字典中的value 方案一 需要做到的要求 这里上面下拉列表是一个组件获取的字典,下面也是通过字典匹配,所以尽量统一封装一个函数,每个组件保证最少变动tabl…

苹果CMS泛目录优化全攻略:局部URL随机化与数据无缝对接

引言 在当今的SEO优化领域,泛目录和站群策略已经成为提升网站权重和流量的重要手段。苹果CMS作为一款功能强大的内容管理系统,其新版框架为开发者提供了丰富的二次开发接口,使得泛目录和站群策略的实现变得更加灵活和高效aoshunseo。本文将详…

基于STM32的智能家居能源管理系统

1. 引言 传统家庭能源管理存在能耗监控粗放、设备联动不足等问题,难以适应绿色低碳发展需求。本文设计了一款基于STM32的智能家居能源管理系统,通过多源能耗监测、负荷预测与优化调度技术,实现家庭能源的精细化管理与智能优化,提…

SpringBoot3—核心特性:基础特性

一、SpringApplication (1)自定义 banner 类路径添加 banner.txt 或设置 spring.banner.location 就可以定制 banner推荐网站:Spring Boot banner在线生成工具,制作下载英文banner.txt,修改替换banner.txt文字实现自…

无服务边缘融合架构:重新定义云原生应用边界

引言:零部署计算的革命突破 Airbnb迁移至LambdaEdge架构后,全球客房详情页渲染延迟降至35ms,冷启动时间缩至50ms以内。Stripe采用无服务边缘计算处理支付事务,成功将动态API响应P99延迟从210ms压缩至19ms。AWS官方基准显示&#…