当前位置: 首页 > news >正文

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

        在 PySide中,contextMenuEvent() 是 QWidget 类(以及继承自它的所有子类)的一个事件处理方法,主要用于处理上下文菜单事件,也就是当用户在控件上右键点击时触发的事件。

• 通过重新定义contextMenuEvent()来实现自定义的鼠标右键菜单

from PySide6.QtGui import QAction
from PySide6.QtWidgets import QApplication, QWidget, QMenu
from PySide6.QtCore import Qtclass MyWidget(QWidget):def __init__(self):super().__init__()# 创建一个菜单self.menu = QMenu(self)# 创建菜单项action1 = QAction("菜单项1", self)action2 = QAction("菜单项2", self)# 将菜单项添加到菜单中self.menu.addAction(action1)self.menu.addAction(action2)# 连接信号和槽,定义点击菜单项后的行为action1.triggered.connect(self.on_action1_triggered)action2.triggered.connect(self.on_action2_triggered)def contextMenuEvent(self, event):# 在鼠标点击的位置显示菜单self.menu.exec(event.globalPos())def on_action1_triggered(self):print("菜单项1被触发")def on_action2_triggered(self):print("菜单项2被触发")# 应用程序执行部分
if __name__ == "__main__":app = QApplication([])widget = MyWidget()widget.show()app.exec()

 • 将其定义在子部件内:

from PySide6.QtGui import QAction
from PySide6.QtWidgets import QApplication, QWidget, QMenu, QPushButtonclass MyWidget(QWidget):def __init__(self):super().__init__()self.setupUi()def setupUi(self):self.button = MyButton(self)class MyButton(QPushButton):def __init__(self, parent=None):super().__init__(parent)self.setText("右键点击我")# 创建一个菜单self.menu = QMenu(self)# 创建菜单项action1 = QAction("菜单项1", self)action2 = QAction("菜单项2", self)# 将菜单项添加到菜单中self.menu.addAction(action1)self.menu.addAction(action2)# 连接信号和槽,定义点击菜单项后的行为action1.triggered.connect(self.on_action1_triggered)action2.triggered.connect(self.on_action2_triggered)def contextMenuEvent(self, event):# 在鼠标点击的位置显示菜单self.menu.exec(event.globalPos())def on_action1_triggered(self):print("菜单项1被触发")def on_action2_triggered(self):print("菜单项2被触发")# 应用程序执行部分
if __name__ == "__main__":app = QApplication([])widget = MyWidget()widget.show()app.exec()

上述代码,只有在按钮上有鼠标右键菜单。 

获取系统默认的右键菜单并添加新的菜单项 

import sys
from PySide6.QtGui import QAction
from PySide6.QtWidgets import QApplication, QLineEdit, QMenuclass MyLineEdit(QLineEdit):def __init__(self, parent=None):super().__init__(parent)self.setText("右键点击我")self.menu = QMenu(self)   # 创建一个菜单self.addMenus()         # 添加菜单的菜单项def addMenus(self):# 获取系统默认的上下文菜单动作default_actions = self.createStandardContextMenu().actions()# 将默认动作添加到新菜单中for action in default_actions:print(action.text())self.menu.addAction(action)# 将新的菜单项添加到新菜单中self.action1 = QAction("菜单项1", self)self.action2 = QAction("菜单项2", self)self.menu.addSeparator()  # 创建分割线# 添加自定义菜单项self.menu.addAction(self.action1)self.menu.addAction(self.action2)# 连接信号和槽函数self.action1.triggered.connect(self.on_action1_triggered)self.action2.triggered.connect(self.on_action2_triggered)# 重写上下文菜单事件def contextMenuEvent(self, event):# 显示菜单self.menu.exec(event.globalPos())def on_action1_triggered(self):print("菜单项1被点击")def on_action2_triggered(self):print("菜单项2被点击")if __name__ == "__main__":app = QApplication(sys.argv)line_edit = MyLineEdit()line_edit.show()sys.exit(app.exec())

        上面的代码,读取了系统内置的默认右键菜单,并增加了两个自定义的菜单项,构成了一个新的菜单。重写了contextMenuEvent(),使其显示新的菜单。

  为新菜单设置快捷方式

import sys
from PySide6.QtGui import QAction
from PySide6.QtWidgets import QApplication, QLineEdit, QMenuclass MyLineEdit(QLineEdit):def __init__(self, parent=None):super().__init__(parent)self.setText("右键点击我")self.menu = QMenu(self)   # 创建一个菜单self.addMenus()         # 添加菜单的菜单项def addMenus(self):# 获取系统默认的上下文菜单动作default_actions = self.createStandardContextMenu().actions()# 将默认动作添加到新菜单中for action in default_actions:self.menu.addAction(action)# 将新的菜单项添加到新菜单中self.action1 = QAction("菜单项1", self)   # 创建菜单项self.action1.setShortcut("Ctrl+B")       # 设置快捷键self.action2 = QAction("菜单项2", self)self.menu.addSeparator()  # 创建分割线# 添加自定义菜单项self.addAction(self.action1)             # 将菜单项添加到部件的主体中,用以生效快捷方式self.menu.addAction(self.action1)  # 将菜单项添加到菜单中self.menu.addAction(self.action2)# 连接信号和槽函数self.action1.triggered.connect(self.on_action1_triggered)self.action2.triggered.connect(self.on_action2_triggered)# 重写上下文菜单事件def contextMenuEvent(self, event):# 显示菜单self.menu.exec(event.globalPos())def on_action1_triggered(self):print("菜单项1被点击")def on_action2_triggered(self):print("菜单项2被点击")if __name__ == "__main__":app = QApplication(sys.argv)line_edit = MyLineEdit()line_edit.show()sys.exit(app.exec())
    这里注意,只有执行了:self.addAction(self.action1),将菜单项添加到部件的主体中,才能生效快捷方式。而self.menu.addAction(self.action1)只是将菜单项添加到菜单中,并未在部件中注册菜单项。

除了重新定义contextMenuEvent(),还有另一种更为灵活的方法:

• 使用策略设置setContextMenuPolicy()的方法来定义菜单:

PyQT(PySide)的上下文菜单策略设置setContextMenuPolicy()-CSDN博客

相关文章:

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

在 PySide中,contextMenuEvent() 是 QWidget 类(以及继承自它的所有子类)的一个事件处理方法,主要用于处理上下文菜单事件,也就是当用户在控件上右键点击时触发的事件。 • 通过重新定义contextMenuEvent()来实现自定…...

Storm实时流式计算系统(全解)——下

storm编程案例-网站访问来源实时统计-需求 storm编程-网站访问来源实时统计-代码实现 根据以上条件可以只写一个类,我们只需要写2个方法和一个main(),一个读取/发射(spout)。 一个拿到数据统计后发到redis…...

配置Nginx日志url encode问题

文章目录 配置Nginx日志url encode问题方法1-lua方法2-set-misc-nginx-module 配置Nginx日志url encode问题 问题描述: 当自定义日志输出格式,需要输出http请求中url参数时,如果参数中包含中文,是会进行url encode的&#xff0c…...

JAVA SE 包装类和泛型

文章目录 📕1. 包装类✏️1.1 基本数据类型和对应的包装类✏️1.2 装箱和拆箱✏️1.3 自动装箱和自动拆箱 📕2. 泛型✏️2.1 泛型的语法✏️2.2 泛型类的使用✏️2.3 裸类型(Raw Type)✏️2.4 擦除机制✏️2.5 泛型的上界✏️2.6 泛型方法✏️2.7 通配符…...

基于Linux系统的物联网智能终端

背景 产品研发和项目研发有什么区别?一个令人发指的问题,刚开始工作时项目开发居多,认为项目开发和产品开发区别不大,待后来随着自身能力的提升,逐步感到要开发一个好产品还是比较难的,我认为项目开发的目的…...

从零开始开发纯血鸿蒙应用之语音朗读

从零开始开发纯血鸿蒙应用 〇、前言一、API 选型1、基本情况2、认识TextToSpeechEngine 二、功能集成实践1、改造右上角菜单2、实现语音播报功能2.1、语音引擎的获取和关闭2.2、设置待播报文本2.3、speak 目标文本2.4、设置语音回调 三、总结 〇、前言 中华汉字洋洋洒洒何其多…...

物联网小范围高精度GPS使用

在园区内实现小范围高精度GPS(全球定位系统)定位,通常需要结合多种技术来弥补传统GPS在精度和覆盖范围上的不足。以下是实现小范围高精度GPS定位的解决方案,包括技术选择、系统设计和应用场景。 一、技术选择 在园区内实现高精度…...

一次有趣的前后端跨越排查

进行前后端代码联调的时候,使用axios调用后端请求,因为都是本地进行联调,所以没有考虑跨域的问题,写了一个get的请求接口,请求后端时,突然跳出下面的问题: 错误的信息一看很像就是跨域的问题&…...

大语言模型(LLM)如何赋能时间序列分析?

引言 近年来,大语言模型(LLM)在文本生成、推理和跨模态任务中展现了惊人能力。与此同时,时间序列分析作为工业、金融、物联网等领域的核心技术,长期依赖传统统计模型(如ARIMA)或深度学习模型&a…...

Kubernetes (K8S) 核心原理深度剖析:从架构设计到运行机制

Kubernetes(K8S)作为容器编排领域的“操作系统”,其设计和实现原理是开发者进阶的必修课。本文将从架构设计、核心组件协作、关键机制实现三个维度,结合源码逻辑与实战场景,分享 K8S 的底层运行原理。 一、Kubernetes 架构设计 1. 声明式 API 与控制器模式 K8S 的核心设…...

Excel 豆知识 - XLOOKUP 为啥会出 #N/A 错误

XLOOKUP有的时候会出 #VALUE! 这个错误。 因为这个XLOOUP有个参数叫 找不到时的返回值,那么为啥还会返回 #VALUE! 呢? 可能还有别的原因,但是主要原因应该就是 检索范围 和 返回范围 不同。 比如这里检索范围在 B列,是 4-21&…...

【深度学习】Hopfield网络:模拟联想记忆

Hopfield网络是一种经典的循环神经网络,由物理学家John Hopfield在1982年提出。它的核心功能是模拟联想记忆,类似于人类大脑通过部分信息回忆完整记忆的能力。以下是通俗易懂的解释: 1. 核心思想 想象你看到一张模糊的老照片,虽然…...

Python可视化大框架的研究与应用

## 摘要 随着数据科学和人工智能的快速发展,数据可视化成为了数据分析中不可或缺的一部分。Python作为一种功能强大且易于学习的编程语言,提供了多种可视化工具和库。本文旨在探讨Python可视化的主要框架,分析其特点、应用场景以及未来发展趋…...

Java 泛型(Generics)详解与使用

一、什么是 Java 泛型? 泛型(Generics)是 Java 1.5 引入的一项重要特性,主要用于 类型参数化,允许在类、接口和方法定义时使用 类型参数(Type Parameter),从而提高代码的复用性、类…...

七、Three.jsPBR材质与纹理贴图

1、PBR材质金属度和粗糙度 1、金属度metalness 金属度属性.metalness表示材质像金属的程度, 非金属材料,如木材或石材,使用0.0,金属使用1.0。 threejs的PBR材质,.metalness默认是0.5,0.0到1.0之间的值可用于生锈的金属外观 new THREE.MeshStandardMaterial({met…...

2024 ChatGPT大模型技术场景与商业应用视频精讲合集(45课).zip

2024ChatGPT大模型技术场景与商业应用视频精讲合集,共十三章,45课。 01. 第一章 ChatGPT:通用人工智能的典范 1.1 ChatGPT概述 .mp4 1.2 通用能力 .mp4 1.3 通用人工智能风口 .mp4 02. 第二章 大模型:ChatGPT的核心支撑 2.1 底层…...

Pytest之parametrize参数化

文章目录 1.前言2.单参数3.多参数4.字典形式5.parametrize 结合 ids 参数 1.前言 在 pytest 中,parametrize 是一个非常实用的装饰器,它允许你对测试函数进行参数化,即使用不同的参数组合多次运行同一个测试函数,从而更高效地进行…...

Python面试(八股)

1. 可变对象和不可变对象 (1). 不可变对象( Immutable Objects ) 不可变对象指的是那些一旦创建后其内容就不能被修改的对象。如果尝试修改不可变对象的内容,将会创建一个新的对象而不是修改原来的对象。常见的不可变类型包括: …...

2024年第十五届蓝桥杯大赛软件赛省赛Python大学A组真题解析《更新中》

文章目录 试题A: 拼正方形(本题总分:5 分)解析答案试题B: 召唤数学精灵(本题总分:5 分)解析答案试题C: 数字诗意解析答案试题D:回文数组试题A: 拼正方形(本题总分:5 分) 【问题描述】 小蓝正在玩拼图游戏,他有7385137888721 个2 2 的方块和10470245 个1 1 的方块,他需…...

湖仓一体概述

湖仓一体之前,数据分析经历了数据库、数据仓库和数据湖分析三个时代。 首先是数据库,它是一个最基础的概念,主要负责联机事务处理,也提供基本的数据分析能力。 随着数据量的增长,出现了数据仓库,它存储的是…...

从MATLAB到C++:手把手教你将鱼眼相机标定结果(Scaramuzza模型)部署到OpenCV项目

从MATLAB到C:手把手教你将鱼眼相机标定结果(Scaramuzza模型)部署到OpenCV项目 鱼眼相机因其超广视角在机器人导航、虚拟现实等领域应用广泛。但MATLAB标定结果如何无缝迁移到C工程环境?本文将彻底解决这个痛点,带您完成…...

不止是打字机效果:手把手教你用SpannableStringBuilder打造Android富文本AI对话界面

超越基础文本渲染:用SpannableStringBuilder构建专业级AI对话界面 在移动应用开发中,AI对话界面的用户体验往往决定了产品的专业度。传统的TextView虽然能显示文字,但要实现类似DeepSeek等专业AI产品的交互效果,需要深入掌握Andro…...

终极窗口管理指南:如何让重要窗口始终置顶提升3倍工作效率

终极窗口管理指南:如何让重要窗口始终置顶提升3倍工作效率 【免费下载链接】AlwaysOnTop Make a Windows application always run on top 项目地址: https://gitcode.com/gh_mirrors/al/AlwaysOnTop 你是否曾经在视频会议时,会议窗口突然被弹出的…...

从SRCNN到WDSR:图像超分辨率核心演进路径与关键技术剖析

1. 图像超分辨率技术的基础认知 当你用手机拍下一张照片却发现放大后模糊不清时,图像超分辨率技术就能派上用场。这项技术就像给图像装上"显微镜",能将低分辨率图片转化为清晰的高分辨率版本。不同于简单的插值放大,它通过深度学习…...

OpenClaw对话式编程:Qwen3-4B模型解释代码与生成示例

OpenClaw对话式编程:Qwen3-4B模型解释代码与生成示例 1. 为什么需要对话式编程? 作为一名长期与代码打交道的开发者,我经常遇到这样的困境:面对一段复杂代码时,需要反复查阅文档;学习新框架时&#xff0c…...

【限时开源】Polars 2.0清洗模板库V1.0发布:含金融时序对齐、电商ID映射、日志正则归一化等9大高复用Pipeline

第一章:Polars 2.0大规模数据清洗技巧入门到精通教程 Polars 2.0 是专为高性能、内存安全与并行计算设计的 DataFrame 库,其惰性执行引擎与零拷贝语义使其在处理 GB 级别结构化数据时显著优于 Pandas。本章聚焦真实场景下的数据清洗实践,涵盖…...

新手入门指南:基于快马平台构建vmware17交互式安装教学应用

新手入门指南:基于快马平台构建VMware17交互式安装教学应用 作为一个刚接触虚拟化技术的新手,第一次安装VMware Workstation 17时可能会遇到不少困惑。从下载安装包到最终配置完成,整个过程涉及多个步骤,每个环节都可能出现各种问…...

Polars 2.0插件生态爆发(2024唯一官方认证清洗套件清单)

第一章:Polars 2.0插件生态爆发(2024唯一官方认证清洗套件清单) 随着 Polars 2.0 的正式发布,其插件系统完成重大重构,首次开放官方插件注册与签名认证机制。截至 2024 年第三季度,Polars 核心团队已通过 …...

社媒爆款流水线:手把手教你用Runway Gen-4.5的A/B测试功能,批量生产TikTok热门视频

社媒爆款流水线:用Runway Gen-4.5打造数据驱动的短视频生产引擎 在短视频内容爆炸式增长的今天,一个残酷的现实是:99%的内容在发布后的24小时内就会沉入算法深渊。那些能突破重围的爆款视频,往往不是偶然灵感的产物,而…...

HsMod:炉石传说个性化增强工具 玩家的全方位游戏体验优化方案

HsMod:炉石传说个性化增强工具 玩家的全方位游戏体验优化方案 【免费下载链接】HsMod Hearthstone Modify Based on BepInEx 项目地址: https://gitcode.com/GitHub_Trending/hs/HsMod 你是否曾因炉石传说中繁琐的操作流程而感到沮丧?是否希望拥有…...