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

news2025/3/1 10:31:47

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

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

from PySide6.QtGui import QAction
from PySide6.QtWidgets import QApplication, QWidget, QMenu
from PySide6.QtCore import Qt


class 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, QPushButton


class 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, QMenu

class 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, QMenu

class 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)只是将菜单项添加到菜单中,并未在部件中注册菜单项。

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2307852.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Redis 持久化方式:RDB(Redis Database)和 AOF(Append Only File)

本部分内容是关于博主在学习 Redis 时关于持久化部分的记录,介绍了 RDB 和 AOF 两种持久化方式,详细介绍了持久化的原理、配置、使用方式、优缺点和使用场景。并对两种持久化方式做了对比。文章最后介绍了 Redis 持久化的意义并与其他常见的缓存技术做了…

数据库测试

TPCH 22条SQL语句分析 - xibuhaohao - 博客园 TPCH模型规范、测试说明及22条语句 - zhjh256 - 博客园 TPC-DS 性能比较:TiDB 与 Impala-PingCAP | 平凯星辰 揭秘Oracle TPC-H性能优化:如何提升数据库查询速度,揭秘实战技巧与挑战 引言 T…

< 自用文儿 > Gobuster 暴力扫描工具与 SecLists 安全测试词表集合

Ethice 道德问题 GFW 的保护下,很多的设备操作系统是停留在更老的版本,应用软件也是,因此很多的漏洞没有被修复。通讯没有使用加密,例如网页没有使用 HTTPS 网站很多。几乎是半裸的在网络上等着被食。 不做恶是下限。 环境&…

关于网页地图的坐标系

EPSG:4326地理坐标系 和 EPSG:3857Web 墨卡托投影 EPSG:4326 定义:EPSG:4326 是基于 WGS84 椭球的地理坐标系,使用经度(Longitude)和纬度(Latitude)表示地球上的位置。特点: 经度范围为 -180 …

华为云之使用鲲鹏弹性云服务器部署Node.js环境【玩转华为云】

华为云之使用鲲鹏弹性云服务器部署Node.js环境【玩转华为云】 一、本次实践介绍1.1 实践环境简介1.3 本次实践完成目标 二、 相关服务介绍2.1 华为云ECS云服务器介绍2.2 Node.js介绍 三、环境准备工作3.1 预置实验环境3.2 查看预置环境信息 四、登录华为云4.1 登录华为云4.2 查…

C语言整体梳理-基础篇-结构体

结构体详解 1.1结构体是什么? 结构体是一些值的集合,这些值成为成员变量,结构体的每个成员可以是不同类型的变量。 数组是相同类型的元素组成的集合,结构体可以是不同类型元素组成的集合。 1.2结构体的声明 1.2.1常规声明 s…

【 实战案例篇三】【某金融信息系统项目管理案例分析】

大家好,今天咱们来聊聊金融行业的信息系统项目管理。这个话题听起来可能有点专业,但别担心,我会尽量用大白话给大家讲清楚。金融行业的信息系统项目管理,说白了就是如何高效地管理那些复杂的IT项目,确保它们按时、按预算、按质量完成。咱们今天不仅会聊到一些理论,还会通…

会话与会话管理:Cookie与Session的深度解析

一、什么是会话? 二、Cookie:客户端存储技术 1. Cookie的工作原理 2、在后端设置cookie 3、在前端设置cookie 三、浏览器开启了cookie禁用怎么办? 一、什么是会话? 会话(Session)是指一个用户与服务器之间…

MAVlink链路环境搭建并解决“ModuleNotFoundError: No module named ‘xxx’”问题

MAVlink链路常用于云台相机与飞控以及地面站之间的数据传输,搭建MAVlink链路环境需要安装Python、Future、MAVLink、pymavlink四样工具用于生成mavlink代码。 Python 直接从官网下载默认安装即可https://www.python.org/downloads/ 在电脑命令行进行安装验证&#x…

java后端开发day23--面向对象进阶(四)--抽象类、接口、内部类

(以下内容全部来自上述课程) 1.抽象类 父类定义抽象方法后,子类的方法就必须重写,抽象方法在的类就是抽象类。 1.定义 抽象方法 将共性的行为(方法)抽取到父类之后。由于每一个子类执行的内容是不一样…

Go - 泛型的使用

泛型的语法 泛型为Go语言添加了三个新的重要特性: 函数和类型的类型参数。将接口类型定义为类型集,包括没有方法的类型。类型推断,它允许在调用函数时在许多情况下省略类型参数。 类型参数 类型参数的使用 除了函数中支持类型参数列表外&#xff0c…

蓝桥杯刷题-dp-线性dp(守望者的逃离,摆花,线段)

[NOIP 2007 普及组] 守望者的逃离 题目描述 恶魔猎手尤迪安野心勃勃,他背叛了暗夜精灵,率领深藏在海底的娜迦族企图叛变。 守望者在与尤迪安的交锋中遭遇了围杀,被困在一个荒芜的大岛上。 为了杀死守望者,尤迪安开始对这个荒岛…

内容中台的企业CMS架构是什么?

企业CMS模块化架构 现代企业内容管理系统的核心在于模块化架构设计,通过解耦内容生产、存储、发布等环节构建灵活的技术栈。动态/静态发布引擎整合技术使系统既能处理实时更新的产品文档,也能生成高并发的营销落地页,配合版本控制机制确保内…

算法题(81):询问学号

审题: 需要我们根据给出的n值确定录入数据个数,然后根据给出的数据存储学号。再根据m值确定需要输出的学号个数,然后根据数组内容输出学号 思路: 我们可以利用数组进行数据顺序存储,以及随机读取完成本题 由于学号最大为1e9&#…

React antd的datePicker自定义,封装成组件

一、antd的datePicker自定义 需求:用户需要为日期选择器的每个日期单元格添加一个Tooltip,当鼠标悬停时显示日期、可兑换流量余额和本公会可兑流量。这些数据需要从接口获取。我需要结合之前的代码,确保Tooltip正确显示,并且数据…

C++ AVL树详解(含模拟实现)

目录 AVL树的概念 AVL树节点的定义 AVL树的插入 AVL树的旋转(难点) AVL树的验证 AVL树的删除(本文不做具体的模拟实现) AVL树的性能 AVL树的模拟实现 AVL树的概念 二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉搜索…

Spring Boot 3.x 系列【3】Spring Initializr快速创建Spring Boot项目

有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot版本3.0.3 源码地址:https://gitee.com/pearl-organization/study-spring-boot3 文章目录 前言安装JDK 17创建Spring Boot 项目 方式1:网页在线生成方式2&#…

Elasticsearch:过滤 HNSW 搜索,快速模式

作者:来自 Elastic Benjamin Trent 通过我们的 ACORN-1 算法实现,探索我们对 Apache Lucene 中的 HNSW 向量搜索所做的改进。 多年来,Apache Lucene 和 Elasticsearch 一直支持使用 kNN 查询的过滤搜索,允许用户检索符合指定元数据…

【AI测试学习】AnythingLLM+Ollama+DeepSeek部署私人知识库

1.搭建DeepSeek大语言模型 1.1Ollama大预言模型部署 Ollama简化了大型语言模型的运行,让每个人都能在本地轻松体验AI的强大,打开浏览器-下载Ollama-输入命令-搞定,这是本地部署大语言模型的全新方式。 这里我们借助Ollama大预言模型部署工具进行搭建 官网如下:Ollama …

通义灵码插件安装入门教学 - IDEA(安装篇)

在开发过程中,使用合适的工具和插件可以极大地提高我们的工作效率。今天,我们将详细介绍如何在 IntelliJ IDEA 中安装并配置通义灵码插件,这是一款旨在提升开发者效率的实用工具。无论你是新手还是有经验的开发者,本文都将为你提供…