🌟想系统化学习 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. 为菜单功能添加快捷方式
我们可以通过 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_())

1367

被折叠的 条评论
为什么被折叠?



