Python GUI 编程 | QPushButton 按钮控件详解 — 菜单操作

部署运行你感兴趣的模型镜像

🌟想系统化学习 GUI 编程?看看这个:[Python GUI 编程] PySide & PyQt - 学习手册-CSDN博客

0x01:QPushButton 菜单操作 — 相关方法

0x0101:setMenu(QMenu)

QPushButton 提供的 setMenu() 方法可以设置一个菜单对象,就类似下面这种:

setMenu() 可以简单理解为,为 QPushButton 添加一个菜单组件,但是这个菜单的布局就比较讲究了,我们下面来讲解一下。

1. 创建菜单功能的两种方式

仔细观察一下上面的菜单,里面主要包括三种东西,第一种是点击后直接执行某种动作,第二种是点击后会展开某个子菜单,第三个就是分割线。

我们先来看第一种控件咋添加,下面是第一种方式(笔者已经尽量写的很 Easy 了,静下心看看):

import sys
from PyQt5.Qt import *
        
# 1. 创建一个应用程序对象
app = QApplication(sys.argv)
# 2. 控件操作
widget = QWidget()
widget.resize(400, 250)
​
### 创建动作 - way 1
new_action = QAction()     # 新建动作
new_action.setText("新建") # 设置动作文本
new_action.setIcon(QIcon("cursor.png")) # 设置动作图标
new_action.triggered.connect(lambda: print("新建被点击了")) # 设置动作被点击的信号槽
​
### 创建菜单对象
menu = QMenu() # 创建菜单
menu.addAction(new_action) # 将动作添加到菜单中
​
### 为 QPushButton 设置菜单
btn = QPushButton("菜单按钮", widget) # 创建按钮
btn.setMenu(menu) # 设置按钮菜单
​
# 3. 展示控件
widget.show()
# 4. 应用程序的执行,进入到消息循环
sys.exit(app.exec_())

第一种方式是先创建一个动作,然后依次为动作设置文本、图标、信号,接着我们将动作添加到菜单中,然后再将菜单添加到 QPushButton 上,一个水灵灵的菜单就实现了。

下面是第二种方式,属于是对动作的一些封装,让我们不用写那么多行代码,功能是等价的:

import sys
from PyQt5.Qt import *
        
# 1. 创建一个应用程序对象
app = QApplication(sys.argv)
# 2. 控件操作
widget = QWidget()
widget.resize(400, 250)
​
### 创建菜单对象
menu = QMenu() # 创建菜单
​
new_action = QAction(QIcon("cursor.png"), "新建", menu) # 创建动作
new_action.triggered.connect(lambda: print("新建被点击了")) # 设置动作被点击的信号槽
​
menu.addAction(new_action) # 将动作添加到菜单中
​
### 为 QPushButton 设置菜单
btn = QPushButton("菜单按钮", widget) # 创建按钮
btn.setMenu(menu) # 设置按钮菜单
​
# 3. 展示控件
widget.show()
# 4. 应用程序的执行,进入到消息循环
sys.exit(app.exec_())

2. 为菜单功能添加快捷方式

传送门 🚀:QAbstractButton 抽象按钮类详解 — 快捷键设置

我们可以通过 setShortcut() 方法为快捷功能添加一个快捷方式,看下面这个示例:

import sys
from PyQt5.Qt import *
        
# 1. 创建一个应用程序对象
app = QApplication(sys.argv)
# 2. 控件操作
widget = QWidget()
widget.resize(400, 250)
​
### 创建菜单对象
menu = QMenu() # 创建菜单
​
new_action = QAction(QIcon("cursor.png"), "新建", menu) # 创建动作
new_action.triggered.connect(lambda: print("新建被点击了")) # 设置动作被点击的信号槽
new_action.setShortcut("Ctrl+N") # 设置快捷键
​
menu.addAction(new_action) # 将动作添加到菜单中
​
### 为 QPushButton 设置菜单
btn = QPushButton("菜单按钮", widget) # 创建按钮
btn.setMenu(menu) # 设置按钮菜单
​
# 3. 展示控件
widget.show()
# 4. 应用程序的执行,进入到消息循环
sys.exit(app.exec_())

3. 为菜单功能添加分割线

我们可以通过 addSeparator() 方法为菜单添加一个分割线,看下面这个示例:

import sys
from PyQt5.Qt import *
        
# 1. 创建一个应用程序对象
app = QApplication(sys.argv)
# 2. 控件操作
widget = QWidget()
widget.resize(400, 250)
​
### 创建菜单对象
menu = QMenu() # 创建菜单
​
new_action = QAction(QIcon("cursor.png"), "新建", menu) # 创建动作
new_action.triggered.connect(lambda: print("新建被点击了")) # 设置动作被点击的信号槽
new_action.setShortcut("Ctrl+N") # 设置快捷键
​
new_action2 = QAction(QIcon("cursor.png"), "保存", menu) # 创建动作
new_action2.triggered.connect(lambda: print("保存被点击了")) # 设置动作被点击的信号槽
new_action2.setShortcut("Ctrl+S") # 设置快捷键
​
menu.addAction(new_action) # 将动作添加到菜单中
menu.addSeparator() # 添加分割线
menu.addAction(new_action2) # 将动作添加到菜单中
​
### 为 QPushButton 设置菜单
btn = QPushButton("菜单按钮", widget) # 创建按钮
btn.setMenu(menu) # 设置按钮菜单
​
# 3. 展示控件
widget.show()
# 4. 应用程序的执行,进入到消息循环
sys.exit(app.exec_())

4. 创建 & 添加子菜单

添加子菜单需要用到 addMenu(QMenu) 方法,该方法接收一个 QMenu 对象,所以嘞,我们需要再创建一个 QMenu 对象:

import sys
from PyQt5.Qt import *
        
# 1. 创建一个应用程序对象
app = QApplication(sys.argv)
# 2. 控件操作
widget = QWidget()
widget.resize(400, 250)
​
### 创建菜单对象
menu = QMenu() # 创建菜单
​
new_action = QAction(QIcon("cursor.png"), "新建", menu) # 创建动作
new_action.triggered.connect(lambda: print("新建被点击了")) # 设置动作被点击的信号槽
new_action.setShortcut("Ctrl+N") # 设置快捷键
​
new_action2 = QAction(QIcon("cursor.png"), "保存", menu) # 创建动作
new_action2.triggered.connect(lambda: print("保存被点击了")) # 设置动作被点击的信号槽
new_action2.setShortcut("Ctrl+S") # 设置快捷键
​
## 创建子菜单
submenu = QMenu("子菜单", menu) # 创建子菜单
submenu.setIcon(QIcon("cursor.png")) # 设置子菜单图标
​
sub_action = QAction(QIcon("cursor.png"),"子菜单项", submenu) # 创建子菜单项
sub_action.triggered.connect(lambda: print("子菜单项被点击了")) # 设置子菜单项被点击的信号槽
​
submenu.addAction(sub_action) # 将子菜单项添加到子菜单中
​
menu.addAction(new_action) # 将动作添加到菜单中
menu.addSeparator() # 添加分割线
menu.addAction(new_action2) # 将动作添加到菜单中
menu.addMenu(submenu) # 将子菜单添加到菜单中
​
### 为 QPushButton 设置菜单
btn = QPushButton("菜单按钮", widget) # 创建按钮
btn.setMenu(menu) # 设置按钮菜单
​
# 3. 展示控件
widget.show()
# 4. 应用程序的执行,进入到消息循环
sys.exit(app.exec_())

0x0102:menu()

QPushButton 提供的 menu() 方法可以直接获取到 QMenu() 对象:

import sys
from PyQt5.Qt import *
        
# 1. 创建一个应用程序对象
app = QApplication(sys.argv)
# 2. 控件操作
widget = QWidget()
widget.resize(400, 250)
​
### 创建菜单对象
menu = QMenu() # 创建菜单
​
new_action = QAction(QIcon("cursor.png"), "新建", menu) # 创建动作
new_action.triggered.connect(lambda: print("新建被点击了")) # 设置动作被点击的信号槽
new_action.setShortcut("Ctrl+N") # 设置快捷键
​
new_action2 = QAction(QIcon("cursor.png"), "保存", menu) # 创建动作
new_action2.triggered.connect(lambda: print("保存被点击了")) # 设置动作被点击的信号槽
new_action2.setShortcut("Ctrl+S") # 设置快捷键
​
## 创建子菜单
submenu = QMenu("子菜单", menu) # 创建子菜单
submenu.setIcon(QIcon("cursor.png")) # 设置子菜单图标
​
sub_action = QAction(QIcon("cursor.png"),"子菜单项", submenu) # 创建子菜单项
sub_action.triggered.connect(lambda: print("子菜单项被点击了")) # 设置子菜单项被点击的信号槽
​
submenu.addAction(sub_action) # 将子菜单项添加到子菜单中
​
menu.addAction(new_action) # 将动作添加到菜单中
menu.addSeparator() # 添加分割线
menu.addAction(new_action2) # 将动作添加到菜单中
menu.addMenu(submenu) # 将子菜单添加到菜单中
​
### 为 QPushButton 设置菜单
btn = QPushButton("菜单按钮", widget) # 创建按钮
btn.setMenu(menu) # 设置按钮菜单
print(btn.menu()) # 获取按钮菜单
# 3. 展示控件
widget.show()
# 4. 应用程序的执行,进入到消息循环
sys.exit(app.exec_())

0x0103:showMenu()

QPushButton 提供的 showMenu() 方法可以通过代码来直接控制菜单的展示:

import sys
from PyQt5.Qt import *
        
# 1. 创建一个应用程序对象
app = QApplication(sys.argv)
# 2. 控件操作
widget = QWidget()
widget.resize(400, 250)
​
### 创建菜单对象
menu = QMenu() # 创建菜单
​
new_action = QAction(QIcon("cursor.png"), "新建", menu) # 创建动作
new_action.triggered.connect(lambda: print("新建被点击了")) # 设置动作被点击的信号槽
new_action.setShortcut("Ctrl+N") # 设置快捷键
​
new_action2 = QAction(QIcon("cursor.png"), "保存", menu) # 创建动作
new_action2.triggered.connect(lambda: print("保存被点击了")) # 设置动作被点击的信号槽
new_action2.setShortcut("Ctrl+S") # 设置快捷键
​
## 创建子菜单
submenu = QMenu("子菜单", menu) # 创建子菜单
submenu.setIcon(QIcon("cursor.png")) # 设置子菜单图标
​
sub_action = QAction(QIcon("cursor.png"),"子菜单项", submenu) # 创建子菜单项
sub_action.triggered.connect(lambda: print("子菜单项被点击了")) # 设置子菜单项被点击的信号槽
​
submenu.addAction(sub_action) # 将子菜单项添加到子菜单中
​
menu.addAction(new_action) # 将动作添加到菜单中
menu.addSeparator() # 添加分割线
menu.addAction(new_action2) # 将动作添加到菜单中
menu.addMenu(submenu) # 将子菜单添加到菜单中
​
### 为 QPushButton 设置菜单
btn = QPushButton("菜单按钮", widget) # 创建按钮
btn.setMenu(menu) # 设置按钮菜单
# 3. 展示控件
widget.show()
btn.showMenu() # 手动展示菜单
# 4. 应用程序的执行,进入到消息循环
sys.exit(app.exec_())

0x02:QPushButton 菜单操作 — 演示案例

演示案例,就复现一下下面这个截图截出来的菜单吧,功能可以不复现,反正外形得像:

import sys
from PyQt5.Qt import *
​
def createMenu():
    menu = QMenu()
​
    # 创建动作
    new_text_file = QAction('新建文本文件', menu)
    new_text_file.setShortcut('Ctrl+N')
    new_text_file.triggered.connect(lambda : print('新建文本文件'))
​
    new_file = QAction('新建文件...', menu)
    new_file.setShortcut('Ctrl+Alt+Windows+N')
    new_file.triggered.connect(lambda : print('新建文件...'))
​
    new_window = QAction('新建窗口', menu)
    new_window.setShortcut('Ctrl+Shift+N')
    new_window.triggered.connect(lambda : print('新建窗口'))
​
    # 创建子菜单
    use_config_create_menu = QMenu('使用配置文件新建窗口', menu)
    create_config = QAction('创建配置文件', use_config_create_menu)
    create_config.triggered.connect(lambda : print('创建配置文件'))
    use_config_create_menu.addAction(create_config)
​
    open_file = QAction('打开文件...', menu)
    open_file.setShortcut('Ctrl+O')
    open_file.triggered.connect(lambda : print('打开文件...'))
​
    open_folder = QAction('打开文件夹...', menu)
    open_folder.setShortcut('Ctrl+K')
    open_folder.triggered.connect(lambda : print('打开文件夹...'))
​
    open_workspace_from_file = QAction('从文件打开工作区...', menu)
    open_workspace_from_file.triggered.connect(lambda : print('从文件打开工作区...'))
​
    # 创建子菜单
    open_recent_files = QMenu('打开最近的文件', menu)
​
    open_close_code_file = QAction("重新打开已关闭的编辑器", open_recent_files)
    open_close_code_file.setShortcut('Ctrl+Shift+T')
    open_close_code_file.triggered.connect(lambda : print("重新打开已关闭的编辑器"))
​
    file1 = QAction(r'G:\tmp\test.py', open_recent_files)
    file2 = QAction(r'G:\tmp\test2.py', open_recent_files)
​
    more = QAction('更多...', open_recent_files)
    more.setShortcut('Ctrl+R')
    more.triggered.connect(lambda : print('更多...'))
​
    clean = QAction('清除最近打开记录', open_recent_files)
    clean.triggered.connect(lambda : print('清除最近打开记录'))
​
    open_recent_files.addAction(open_close_code_file)
    open_recent_files.addSeparator()
    open_recent_files.addAction(file1)
    open_recent_files.addAction(file2)
    open_recent_files.addSeparator()
    open_recent_files.addAction(more)
    open_recent_files.addAction(clean)
​
    menu.addAction(new_text_file)
    menu.addAction(new_file)
    menu.addAction(new_window)
    menu.addMenu(use_config_create_menu)
    menu.addSeparator()
    menu.addAction(open_file)
    menu.addAction(open_folder)
    menu.addAction(open_workspace_from_file)
    menu.addMenu(open_recent_files)
​
    return menu
​
# 1. 创建一个应用程序对象
app = QApplication(sys.argv)
# 2. 控件操作
widget = QWidget()
widget.resize(600, 450)
​
btn = QPushButton('文件(F)', widget)
menu = createMenu()
btn.setMenu(menu)
​
# 3. 展示控件
widget.show()
btn.showMenu() # 手动展示菜单
# 4. 应用程序的执行,进入到消息循环
sys.exit(app.exec_())

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Blue17 :: Hack3rX

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值