QpushButton菜单设置 和 右键菜单

news2024/11/24 4:08:47

一、前言

​ 在PyQt中,可以通过QMenuQAction类来创建和管理菜单。QMenu用于定义具体的菜单,而QAction则代表菜单中的具体操作项。

二、点击QPushButton,显示菜单

  1. API

    • QPushButton操作菜单的相关Api
      在这里插入图片描述

    • QMenu自身相关Api
      在这里插入图片描述

  2. 代码演示

    • 代码:
    from PyQt5.Qt import *
    import sys
    
    app = QApplication(sys.argv)
    
    window = QWidget()
    window.setWindowTitle("测试按钮菜单")
    window.resize(500, 500)
    
    btn = QPushButton()
    btn.setParent(window)
    btn.setText("测试菜单按钮")
    btn.setIcon(QIcon("菜单.png"))
    
    # *************菜单的设置***************开始
    # 创建一个菜单实例,该菜单将与按钮关联
    menu = QMenu(window)
    
    # 创建一个新的 QAction 实例,代表"新建"操作
    new_action = QAction(QIcon("新建.png"), "新建", menu)
    new_action.triggered.connect(lambda :print("新建文件"))
    
    open_action = QAction(QIcon("打开.png"), "打开", menu)
    open_action.triggered.connect(lambda :print("打开文件"))
    
    exit_action = QAction("退出", menu)
    exit_action.triggered.connect(lambda :print("退出程序"))
    
    # 创建一个子菜单实例,用于存储最近打开的文件
    open_recent_menu = QMenu(menu)
    # 设置子菜单的标题
    open_recent_menu.setTitle("最近打开")
    
    # 创建一个新的 QAction 实例,代表"最近的文件"
    file_action = QAction("最近的文件")
    
    # 将各个操作添加到菜单中
    menu.addAction(new_action)
    menu.addAction(open_action)
    open_recent_menu.addAction(file_action)
    # 将子菜单添加到主菜单中
    menu.addMenu(open_recent_menu)
    # 添加一个分隔线,以区分不同的操作组
    menu.addSeparator()
    menu.addAction(exit_action)
    
    # 将菜单设置为按钮的关联菜单
    btn.setMenu(menu)
    # *************菜单的设置***************结束
    
    window.show()
    
    sys.exit(app.exec_())
    
    • 结果:

      在这里插入图片描述

三、右键菜单

  1. API

    • 右键事件继承自 QWidget,Api如下图所示:

      在这里插入图片描述

      如图所示,右键菜单有两种方式:

      • 继承QWidget,重写 contextMenuEvent 方法,在方法中实现menu的创建即可;

      • 控件类设置右键菜单策略为自定义:

        your_window.setContextMenuPolicy(Qt.CustomContextMenu)
        

        然后定义上下文菜单的请求信号槽函数,在槽函数中创建菜单:

        your_window.customContextMenuRequested.connect(your_slot)
        
  2. 代码演示

    • 方式一,继承QWidget,重写 contextMenuEvent 方法,代码:

      from PyQt5.Qt import *
      import sys
      
      class Window(QWidget):
          def contextMenuEvent(self, event) -> None:
              print("上下文菜单调用方法")
              # *************菜单的设置***************开始
              # 创建一个菜单实例,该菜单将与按钮关联
              menu = QMenu(window)
      
              # 创建一个新的 QAction 实例,代表"新建"操作
              new_action = QAction(QIcon("新建.png"), "新建", menu)
              new_action.triggered.connect(lambda: print("新建文件"))
      
              open_action = QAction(QIcon("打开.png"), "打开", menu)
              open_action.triggered.connect(lambda: print("打开文件"))
      
              exit_action = QAction("退出", menu)
              exit_action.triggered.connect(lambda: print("退出程序"))
      
              # 创建一个子菜单实例,用于存储最近打开的文件
              open_recent_menu = QMenu(menu)
              # 设置子菜单的标题
              open_recent_menu.setTitle("最近打开")
      
              # 创建一个新的 QAction 实例,代表"最近的文件"
              file_action = QAction("最近的文件")
      
              # 将各个操作添加到菜单中
              menu.addAction(new_action)
              menu.addAction(open_action)
              open_recent_menu.addAction(file_action)
              # 将子菜单添加到主菜单中
              menu.addMenu(open_recent_menu)
              # 添加一个分隔线,以区分不同的操作组
              menu.addSeparator()
              menu.addAction(exit_action)
      
              # 在鼠标点击的位置显示菜单
              menu.exec_(event.globalPos())
              # *************菜单的设置***************结束
      
      app = QApplication(sys.argv)
      
      window = Window()
      window.setWindowTitle("测试右键菜单")
      window.resize(500, 500)
      
      window.show()
      
      sys.exit(app.exec_())
      
    • 方式二,控件类设置右键菜单策略为自定义,代码:

      from PyQt5.Qt import *
      import sys
      
      def get_menu(point) -> None:
          print("上下文菜单调用方法")
          # *************菜单的设置***************开始
          # 创建一个菜单实例,该菜单将与按钮关联
          menu = QMenu(window)
      
          # 创建一个新的 QAction 实例,代表"新建"操作
          new_action = QAction(QIcon("新建.png"), "新建", menu)
          new_action.triggered.connect(lambda: print("新建文件"))
      
          open_action = QAction(QIcon("打开.png"), "打开", menu)
          open_action.triggered.connect(lambda: print("打开文件"))
      
          exit_action = QAction("退出", menu)
          exit_action.triggered.connect(lambda: print("退出程序"))
      
          # 创建一个子菜单实例,用于存储最近打开的文件
          open_recent_menu = QMenu(menu)
          # 设置子菜单的标题
          open_recent_menu.setTitle("最近打开")
      
          # 创建一个新的 QAction 实例,代表"最近的文件"
          file_action = QAction("最近的文件")
      
          # 将各个操作添加到菜单中
          menu.addAction(new_action)
          menu.addAction(open_action)
          open_recent_menu.addAction(file_action)
          # 将子菜单添加到主菜单中
          menu.addMenu(open_recent_menu)
          # 添加一个分隔线,以区分不同的操作组
          menu.addSeparator()
          menu.addAction(exit_action)
      
          # 在全局坐标系下转换点的位置并显示菜单
          dest_point = window.mapToGlobal(point)  #point是相对桌面的绝对位置,转换为相对父控件的位置
          menu.exec_(dest_point)
          # *************菜单的设置***************结束
      
      app = QApplication(sys.argv)
      
      window = QWidget()
      window.setWindowTitle("测试右键菜单")
      window.resize(500, 500)
      
      # 设置窗口的上下文菜单策略为自定义,并连接自定义右键菜单请求信号到处理函数
      window.setContextMenuPolicy(Qt.CustomContextMenu)
      window.customContextMenuRequested.connect(get_menu) #传入一个相对桌面的绝对位置
      
      window.show()
      
      sys.exit(app.exec_())
      

      注意:customContextMenuRequested会给槽函数传入一个相对桌面的绝对位置,需要在槽函数中转换为相对父控件的位置再进行使用。

    • 结果
      在这里插入图片描述


总结

​ 注意掌握菜单的创建 和 action 的添加,以及 按钮点击显示菜单 和 右键显示菜单 的两种方式。

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

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

相关文章

你以为出现NoClassDefFoundError错误会是什么原因?

你以为出现NoClassDefFoundError错误会是什么原因? 1、概述2、事情经过3、总结 1、概述 大家好,我是欧阳方超,可以关注我的公众号“欧阳方超”,后续内容将在公众号首发。 同样的错误,非一样的解决方式。NoClassDefFou…

CComboBoxEx

很久以前写的一段代码感觉比较有意思记录下 一、前面是bmp的图像后面是文字 BOOL bRe Img.Create(IDB_BITMAP_Chamfer, 50, 8, RGB(255, 0, 0));mComBoxChamfer.SetImageList(&Img);COMBOBOXEXITEM cbexItem;cbexItem.mask CBEIF_IMAGE | CBEIF_SELECTEDIMAGE | CBEIF_O…

【算法】【动规】最长定差子序列,大数组优化!!

跳转汇总链接 👉🔗动态规划算法汇总链接 优化在后面! 2.5 最长定差子序列 🔗题目链接 给你一个整数数组 arr 和一个整数 difference,请你找出并返回 arr 中最长等差子序列的长度,该子序列中相邻元素之间…

【CF闯关练习】—— 800分段

🌏博客主页:PH_modest的博客主页 🚩当前专栏:cf闯关练习 💌其他专栏: 🔴每日一题 🟡 C跬步积累 🟢 C语言跬步积累 🌈座右铭:广积粮,缓…

WPF组合控件TreeView+DataGrid之TreeView封装

(关注博主后,在“粉丝专栏”,可免费阅读此文) wpf的功能非常强大,很多控件都是原生的,但是要使用TreeViewDataGrid的组合,就需要我们自己去封装实现。 我们需要的效果如图所示&#x…

云上查看容器日志

有时候在云上希望查看容器日志,但web UI界面上看不到日志,怎么办?可以登入容器查看。 该做法适用于各种云上平台,包括华为云、腾讯云等。 首先用ssh登陆宿主机 [rootxxx ~]# 然后用docker列举所有容器,找到你想查看的…

科普-电子合同签署,这三步不能忽视

关于电子合同,许多人认为我自己直接内部发送邮件/传真等发送电子版合同或者我自己创建一个电子合同平台,这种怎么不属于电子合同呢? 在这里给大家科普一个知识点:签电子合同,需要经过这“三个步骤”。 根据《电子签名…

PYthon Pandas 时间序列数据重采样-resample()方法(第23讲)

PYthon Pandas 时间序列数据重采样-resample()方法(第23讲)         🍹博主 侯小啾 感谢您的支持与信赖。☀️ 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔…

12、Qt:用QProcess类启动外部程序:简单使用

一、说明 简单使用:在一个函数中,使用QProcess类的临时对象调用可执行文件exe,只有这个exe执行完了,这个函数才往下执行,一次性打印出exe所有输出信息;复杂使用:创建QProcess类的全局对象&…

代码随想录算法训练营Day6 | 454.四数相加||、383.赎金信、35.三个之和、18.四数之和

LeetCode 454 四数相加 || 本题思路: 如果使用暴力的话就是 4 层 for 循环,这个时间复杂度就是 O(n^4) 了。 所以我们可以使用 map ,来解决这道题,和之前的两数之和一样,之前是 遍历一个,存进去一个。 如果…

IIC使用方法

IIC模块简介 iic是stm32芯片上的一个外设 有两个外设接口 其中iic1可以重映射 iic2不可以重映射 寄存器组和内部结构 因为iic外设挂载在APB1总线上 所以时钟也是来自于APB1总线 时钟控制寄存器就是控制开关的 发送数据和接收数据都是经过了双缓冲区(串行转行 接收 …

蓝桥杯专题-真题版含答案-【扑克牌排列】【取球博弈】【古堡算式】【泊松分酒】

Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列ChatGPT和AIGC 👉关于作者 专注于Android/Unity和各种游戏开发技巧,以及各种资源分…

南京航空航天大学-高等计算机网络复习

计算机网络复习 计算机网络 通信网络 网络提供信息传递服务(端用户角度) 通信介质:电子和光子,传输介质:fiber……,交换方式,协议,算法,功能,应用 通信网…

【DOM笔记四】事件高级!(注册/删除事件、DOM事件流、事件对象、事件委托、鼠标 / 键盘事件、相关案例)

文章目录 7 事件高级7.1 注册事件概述7.2 删除事件7.3 DOM事件流7.4 事件对象7.5 事件委托7.6 鼠标事件7.6.1 常用的鼠标事件7.6.2 鼠标事件对象 7.7 键盘事件7.7.1 常用的键盘事件7.7.2 键盘事件对象 7 事件高级 7.1 注册事件概述 给元素添加事件,称为注册事件或…

码住不亏!10家程序员接单平台横向对比

很多程序员都在空闲时间想要尝试接单,其实程序员接单在程序员圈子里非常常见,但想要找到一个合适的程序员接单平台却很难,今天给兄弟们整理了18个程序员接单平台的横向对比,希望可以给还在观望的小伙伴一点参考。 程序员客栈 规…

真一键关闭BitLocker!

网管小贾 / sysadm.cc 同事老莫近日喜提新电脑一台,遂请我周末去他家帮忙给电脑开开光。 我口送佛号欣然应允,心中暗道又能喝到嫂夫人的私人定制绝美养生鸡汤,嘿嘿,阿弥陀佛,善哉善哉! 老莫家就租住在市中…

Python---TCP服务端程序开发

1. 开发 TCP 服务端程序开发步骤回顾 创建服务端端套接字对象绑定端口号设置监听等待接受客户端的连接请求接收数据发送数据关闭套接字 2. socket 类的介绍 导入 socket 模块import socket 创建服务端 socket 对象socket.socket(AddressFamily, Type) 参数说明: AddressF…

从0到1打造一款WebStyle串口调试工具

Tip:No Ego Some programmers have a huge problem: their own ego. But there is no time for developing an ego. There is no time for being a rockstar. Who is it who decides about your quality as programmer? You? No. The others? Probably. But can you really…

拥抱鸿蒙 - 在展讯T606平台上的探索与实践

前 言 自OpenHarmony 问世后受到了社会各界的广泛关注,OpenHarmony 的生态系统在如火如荼的发展。 酷派作为一家积极拥抱变化的公司,经过一段时间的探索与实践,成功实现将OpenHarmony 系统接入到展讯平台上,我们相信这是一个重要…

Infant-freesurfer安装和使用,适用于0-2岁婴幼儿大脑自动分割

Infant-freesurfer安装和使用 #Note https://surfer.nmr.mgh.harvard.edu/fswiki/infantFS --官网申请下载infant_recon_all --s SUBJ --age age_in_months--newborn flag (it aut