PyQt: 按钮菜单 / 上下文菜单 / 设置上下文菜单策略PyQt: 按钮菜单 / 上下文菜单 / 设置上下文菜单策略PyQt: 按钮菜单 / 上下文菜单 / 设置上下文菜单策略PyQt: 按钮菜单 / 上下文菜单 / 设置上下文菜单策略
  • 首页
  • 博客
  • 书签
  • 文件
  • 分析
  • 登录

PyQt: 按钮菜单 / 上下文菜单 / 设置上下文菜单策略

发表 admin at 2022年4月2日
类别
  • Practice
标签
import sys
from PyQt5.Qt import *


# 定义菜单类
class Menu(object):
    # parent 父类, indicator 信息显示, position 菜单显示位置
    def __init__(self, parent, indicator, position=None):
        self.parent = parent
        self.indicator = indicator
        self.position = position

    def menu_func(self):
        # 判断是按钮的菜单还是上下文菜单
        if self.parent.objectName() == "push_button":
            self.menu = QMenu()
            self.parent.setMenu(self.menu)
        elif self.parent.objectName() == "main_window":
            self.menu = QMenu(self.parent)
        # 菜单项
        # !-----------
        action_new = QAction(QIcon("logo.png"), "新建", self.menu)
        self.menu.addAction(action_new)

        def action_open_func():
            self.indicator.setText("新建")
            self.indicator.adjustSize()

        # 连接点击菜单项信号和槽
        action_new.triggered.connect(action_open_func)
        # !-----------
        action_open = QAction(QIcon("cursor.png"), "打开", self.menu)
        self.menu.addAction(action_open)

        def action_open_func():
            self.indicator.setText("打开")
            self.indicator.adjustSize()

        action_open.triggered.connect(action_open_func)
        # 子菜单
        # !-----------
        self.recent_files_submenu_func()
        # 分割线
        # !-----------
        self.menu.addSeparator()
        # !-----------
        action_close = QAction(QIcon("cursor.png"), "退出", self.menu)
        self.menu.addAction(action_close)

        def action_open_func():
            self.indicator.setText("退出")
            self.indicator.adjustSize()

        action_close.triggered.connect(action_open_func)

    # 子菜单
    def recent_files_submenu_func(self):
        recent_files_submenu = QMenu(self.menu)
        recent_files_submenu.setTitle("最近打开")
        # !-----------
        action_1 = QAction("文件1", recent_files_submenu)
        recent_files_submenu.addAction(action_1)

        def action_1_func():
            self.indicator.setText("最近打开:文件1")
            self.indicator.adjustSize()

        action_1.triggered.connect(action_1_func)
        # !-----------
        action_2 = QAction("文件2", recent_files_submenu)
        recent_files_submenu.addAction(action_2)

        def action_2_func():
            self.indicator.setText("最近打开:文件2")
            self.indicator.adjustSize()

        action_2.triggered.connect(action_2_func)
        # !-----------

        self.menu.addMenu(recent_files_submenu)

    # 显示上下文菜单
    def menu_exec_(self):
        self.menu.exec_(self.position)


class Window(QWidget):
    def __init__(self):
        super().__init__()
        self.setup_ui()
        self.push_button_func()
        self.context_menu_policy_radio_button_func()
        self.context_menu_func()

    # 重写上下文菜单事件处理方法,如果选择Qt.DefaultContextMenu,使用此策略
    def contextMenuEvent(self, a0) -> None:
        self.radio_button_1.setText("当前右键菜单策略:\nQt.DefaultContextMenu")
        self.radio_button_1.adjustSize()

        # 生成上下文菜单实例
        self.right_click_menu = Menu(self, self.label, a0.globalPos())
        self.right_click_menu.menu_func()
        self.right_click_menu.menu_exec_()

    def setup_ui(self):
        self.setWindowTitle("Qt桌面应用程序")
        self.setObjectName("main_window")
        self.resize(300, 300)

        # 定义标签,用于信息显示
        self.label = QLabel("请选择功能!", self)
        self.label.move(50, 50)

    def context_menu_policy_radio_button_func(self):
        # 定义单选框,用于选择上下文菜单策略
        self.radio_button_1 = QRadioButton(self)
        self.radio_button_1.move(50, 200)
        self.radio_button_2 = QRadioButton(self)
        self.radio_button_2.move(50, 240)

        def radio_button_text():
            self.radio_button_1.setText("Qt.DefaultContextMenu")
            self.radio_button_1.adjustSize()
            self.radio_button_2.setText("Qt.DefaultContextMenu")
            self.radio_button_2.adjustSize()

        radio_button_text()
        # 默认选框第一个单选框
        self.radio_button_1.setChecked(True)

        # 判断并设置上下文菜单策略
        def context_menu_policy():
            if self.radio_button_1.isChecked():
                self.setContextMenuPolicy(Qt.DefaultContextMenu)
                radio_button_text()
            elif self.radio_button_2.isChecked():
                self.setContextMenuPolicy(Qt.CustomContextMenu)
                radio_button_text()

        # 程序运行即设置上下文菜单策略
        context_menu_policy()

        # 连接单选框信号与槽
        self.radio_button_1.clicked.connect(context_menu_policy)
        self.radio_button_2.clicked.connect(context_menu_policy)

    def context_menu_func(self):
        # 定义上下文菜单槽函数,
        def context_menu(a0):
            self.radio_button_2.setText("当前右键菜单策略:\nQt.DefaultContextMenu")
            self.radio_button_2.adjustSize()
            cursor_global_point = self.mapToGlobal(a0)
            self.right_click_menu = Menu(self, self.label, cursor_global_point)
            self.right_click_menu.menu_func()
            self.right_click_menu.menu_exec_()

        # 上下文菜单策略如果选择Qt.DefaultContextMenu,连接信号与槽
        self.customContextMenuRequested.connect(context_menu)

    def push_button_func(self):
        # 定义菜单按钮
        self.push_button = QPushButton(QIcon("cursor.png"), "按钮", self)
        self.push_button.setObjectName("push_button")
        self.push_button.move(50, 100)
        # 生成按钮的菜单实例
        self.push_button_menu = Menu(self.push_button, self.label)
        self.push_button_menu.menu_func()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = Window()
    window.show()
    sys.exit(app.exec_())

发表回复 取消回复

要发表评论,您必须先登录。

类别

  • Cat
  • Python
  • Django
  • Database
  • Html/CSS
  • JavaScript
  • Vue
  • RegExp
  • Maths/AI
  • PHP/Wordpress
  • Practice
  • Linux
  • Windows
  • Android
  • NAS
  • Software
  • Hardware
  • Network
  • SEO
  • English
  • Games
  • Recipes
  • General
  • Memorandum
  • Essays
  • 未分类

归档

©2015-2023 艾丽卡 Blog support@alaica.com
      ajax-loader