QpushButton菜单设置 和 右键菜单

一、前言

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

二、点击QPushButton,显示菜单

  1. API

    • QPushButton操作菜单的相关Api
      QpushButton菜单设置 和 右键菜单_第1张图片

    • QMenu自身相关Api
      QpushButton菜单设置 和 右键菜单_第2张图片

  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_())
    
    • 结果:

      QpushButton菜单设置 和 右键菜单_第3张图片

三、右键菜单

  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会给槽函数传入一个相对桌面的绝对位置,需要在槽函数中转换为相对父控件的位置再进行使用。

    • 结果
      QpushButton菜单设置 和 右键菜单_第4张图片


总结

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

你可能感兴趣的:(python,pyqt)