文章目录
- 前言
- [一、按钮类控件(QAbstractButton) 简介](#一、按钮类控件(QAbstractButton) 简介)
- 二、常用函数和信号
-
- [1.QAbstractButton 类中常用的函数介绍](#1.QAbstractButton 类中常用的函数介绍)
- [2.QAbstractButton 类中常用的信号介绍](#2.QAbstractButton 类中常用的信号介绍)
- [三、QPushButton - 通用命令按钮](#三、QPushButton - 通用命令按钮)
- [四、QRadioButton 、QCheckBox、QCommandLinkButton介绍](#四、QRadioButton 、QCheckBox、QCommandLinkButton介绍)
-
- [1.QRadioButton - 单选按钮](#1.QRadioButton - 单选按钮)
- [2.QCheckBox - 复选框](#2.QCheckBox - 复选框)
- [3.QCommandLinkButton - 现代命令链接](#3.QCommandLinkButton - 现代命令链接)
- [五、QToolButton - 工具栏专用按钮](#五、QToolButton - 工具栏专用按钮)
- 总结与选择指南
前言
本节主要介绍基本窗口控件中的 按钮类控件(QAbstractButton) ,按钮是用户界面中最基础、最重要的交互元素,PySide6 提供了多种专门的按钮控件来满足不同场景的需求,让我们来探索下各种按钮的功能。
一、按钮类控件(QAbstractButton) 简介
1.继承链关系
按钮的基类是 QAbstractButton,提供了按钮的通用性功能 。QAbstractButton 为抽象类,
不能实例化,必须由其他的按钮类继承自 QAbstractButton,从而实现不同的功能、不同
的表现形式:
QWidget ← QAbstractButton← QPushButton / QToolButton/ QRadioButton / QCheckBox
2.按钮类控件概览
PySide6 的按钮控件都继承自 QAbstractButton 基类,共享一些核心功能,但各有专长:
| 控件类型 | 核心用途 | 典型场景 |
|---|---|---|
| QPushButton | 通用命令按钮 | 表单提交、对话框确认、操作触发 |
| QRadioButton | 单选按钮(互斥选择) | 设置选项、单项选择 |
| QCheckBox | 复选框(多选) | 功能开关、多项选择 |
| QCommandLinkButton | 现代风格命令链接 | 向导界面、步骤引导 |
| QToolButton | 工具栏专用按钮 | 工具栏、紧凑布局、快速操作 |
二、常用函数和信号
1.QAbstractButton 类中常用的函数介绍
| 函数 | 功能描述 |
|---|---|
| setCheckable() | 设置按钮是否已经被选中,如果设置为 True,则表示按钮将保持已单击和释放状态 |
| toggle() | 在按钮状态之间进行切换 |
| setIcon() | 设置按钮上的图标 |
| setEnabled() | 设置按钮是否可以使用,当设置为 False 时,按钮变成不可用状态,单击它不会发射信号 |
| isChecked() | 返回按钮的状态,返回值为 True 或 False |
| setDefault() | 设置按钮的默认状态 |
| setText() | 设置按钮的显示文本 |
| text() | 返回按钮的显示文本 |
| setTriState() | 将复选框设置为三态(QCheckBox独有) |
| checkState() | 查询三态复选框被勾选的状态(QCheckBox独有) |
2.QAbstractButton 类中常用的信号介绍
| 信号 | 功能描述 |
|---|---|
| Pressed | 当鼠标指针在按钮上并按下左键时触发该信号 |
| Released | 当鼠标左键被释放时触发该信号 |
| Clicked | 当鼠标左键被按下并释放时,或者快捷键被释放时触发该信号 |
| Toggled | 当按钮的标记状态发生变化时触发该信号 |
| stateChanged | 按钮的当前状态被改变时触发改信号(QCheckBox独有) |
| triggered(QAction) | 当QToolButton 中的某个 QAction 被单击时,QToolButton 会触发 triggered 信号,并把该QAction 作为参数传递给槽函数,通过解析 QAction 就可以知道单击的是哪个按钮(QToolButton独有) |
三、QPushButton - 通用命令按钮
1.基础用法
①通过setCheckable(True)函数将按钮设置为可以被选择状态;
②要使 toggle() 函数生效,按钮必须首先设置为可选中状态;
③通过setEnabled(False)函数来禁用按钮,使其不可用;
④setIcon()设置图标、setText()设置文本的基础用法;
python
#将按钮1设置为可以被选择状态
self.ui.Button01.setCheckable(True)
self.ui.Button01.toggled.connect(lambda: self.button_click(self.ui.Button01))
#要使 toggle() 函数生效,按钮必须首先通过 setCheckable(True) 设置为可选中状态
self.ui.Button02.clicked.connect(lambda: self.ui.Button01.toggle()) # 点击按钮2将切换按钮1的状态,即改变"选中True" "未选中False"的状态
self.ui.Button02.clicked.connect(self.button02_click)
def button_click(self, button):
if button.isChecked():
self.ui.lab_Text.setText('你按下了' + button.text() + " isChecked=True")
else:
self.ui.lab_Text.setText('你按下了' + button.text() + " isChecked=False")
# 启用按钮
self.ui.Button03.setEnabled(True)
def button02_click(self, button):
# 设置图标
self.ui.Button02.setIcon(QIcon(':/res/Resources/image/python.png'))
# 设置图标尺寸
self.ui.Button02.setIconSize(QSize(24, 24))
self.ui.Button02.setText("文本改变!")
# 禁用按钮
self.ui.Button03.setEnabled(False)

注意点:信号 toggled 和 clicked 的区别,clicked 需要点击按钮才能触发信号,toggled 只要按钮状态改变后就会触发信号,上面的代码使用 按钮2 的触发去改变 按钮1 状态,从而间接的触发了 按钮1 。
2.高级特性
①状态控制:将按钮设置自动重复(长按时重复触发)
python
# 将按钮3设置自动重复(长按时重复触发)
self.ui.Button03.setAutoRepeat(True)
self.ui.Button03.setAutoRepeatDelay(500) # 初始延迟(ms)
self.ui.Button03.setAutoRepeatInterval(500) # 重复间隔(ms)
self.ui.Button03.clicked.connect(lambda : print(f"按钮3被触发了!!!"))
②图标与样式:通过样式表自定义外观
python
# 通过样式表自定义外观
self.ui.Button03.setStyleSheet("""
QPushButton
{
background-color: #4CAF50; /* 背景色 */
color: Blue; /* 文字颜色 */
border: none; /* 无边框 */
padding: 8px 16px; /* 内边距 */
border-radius: 8px; /* 圆角 */
font-weight: bold;
}
QPushButton:hover
{
background-color: #45a049; /* 悬停效果 */
}
QPushButton:pressed
{
background-color: #3d8b40; /* 按下效果 */
}
QPushButton:disabled
{
background-color: #cccccc; /* 禁用状态 */
color: #666666;
}
""")
③设置按钮为默认按钮(按可Enter键触发):注意在 QMainWindow、QWidget 窗口上 Button 只有被选中后按Enter键才有效,在 QDialog 界面直接按Enter键就有效
python
# 设置按钮4为默认按钮(按Enter键触发)
self.ui.Button04.setDefault(True)
self.ui.Button04.setCheckable(True)
self.ui.Button04.clicked.connect(lambda: self.button_click(self.ui.Button04))

四、QRadioButton 、QCheckBox、QCommandLinkButton介绍
1.QRadioButton - 单选按钮
①用于互斥选择,同一时间只能选择一个选项;
②QRadioButton 是单选按钮控件,默认是独占的(Exclusive)。继承自父类QAbstractButton 的多个单选按钮属于同一个按钮组合,在单选按钮组合中,一次只能选择一个单选按钮。如果需要将多个独占的按钮进行组合,则需要将它们放在 QGroupBox 或 QButtonGroup 中,建议使用 QGroupBox 已集成的组件。
python
#QRadioButton - 单选按钮
self.ui.btn_Apple.setChecked(True)
self.ui.btn_Apple.toggled.connect(lambda: self.Fruit_select(self.ui.btn_Apple))
self.ui.btn_Pineapple.toggled.connect(lambda: self.Fruit_select(self.ui.btn_Pineapple))
self.ui.btn_Durian.toggled.connect(lambda: self.Fruit_select(self.ui.btn_Durian))

2.QCheckBox - 复选框
①用于多选场景,支持三种状态,setTriState() 将复选框设置为三态,checkState() 查询三态复选框被勾选的状态;
②QCheckBox 提供了一组带文本标签的复选框,用户可以从中选择多个选项。
python
#QCheckBox - 复选框
self.ui.box01.setChecked(False)
self.ui.box01.stateChanged.connect(self.Animation_select)
self.ui.box02.setChecked(False)
self.ui.box02.stateChanged.connect(self.Animation_select)
self.ui.box03.setTristate(True) # 启用三态
self.ui.box03.setIcon(QIcon(':/res/Resources/image/6.png'))
self.ui.box03.setCheckState(Qt.CheckState.PartiallyChecked)
self.ui.box03.stateChanged.connect(self.Animation_select)
def Animation_select(self):
if self.ui.box01.isChecked():
A_box01 = "喜欢"
else:
A_box01 = "不喜欢"
if self.ui.box02.isChecked():
A_box02 = "喜欢"
else:
A_box02 = "不喜欢"
if self.ui.box03.checkState() == Qt.CheckState.Checked:
A_box03 = "喜欢"
elif self.ui.box03.checkState() == Qt.CheckState.Unchecked:
A_box03 = "不喜欢"
else:
A_box03 = "无所谓"
self.ui.lab_Text.setText(f"你对动漫 【凡人修仙传】 是{A_box01}的;对 【仙逆】 是{A_box02}的;对 【斗破苍穹】 是{A_box03}的")
注意点:通过 setCheckState() 函数可设置控件当前属于哪种状态:
| 状 态 名 称 | 值 | 含 义 |
|---|---|---|
| Qt.CheckState.Unchecked | 0 | 组件没有被勾选(默认值) |
| Qt.CheckState.PartiallyChecked | 1 | 组件被半勾选 |
| Qt.CheckState.Checked | 2 | 组件被勾选 |

3.QCommandLinkButton - 现代命令链接
① Vista 风格的命令链接按钮,具有现代外观;
② QCommandLinkButton 是QPushButton 的子类,适用于特殊的场景,如单击软件安装界面中的"下一步"按钮切换到其他窗口,它是 QPushButton 在特定场景下的替代品,在一般场景下没有必要使用。
python
#QCommandLinkButton - 现代命令链接
self.ui.com_btn01.setCheckable(True)
self.ui.com_btn01.toggled.connect(lambda: self.button_click(self.ui.com_btn01))
self.ui.com_btn02.setCheckable(True)
self.ui.com_btn02.setDescription('设置自定义图片')
self.ui.com_btn02.setIcon(QIcon(':/res/Resources/image/110.jpg'))
self.ui.com_btn02.setIconSize(QSize(50, 50))
self.ui.com_btn02.toggled.connect(lambda: self.button_click(self.ui.com_btn02))

五、QToolButton - 工具栏专用按钮
1.基础功能
①专为工具栏设计,支持多种显示样式,更加紧凑;
②正常的文本工具按钮可以当作普通按钮来进行使用;
③自动提升(AutoRaise)功能,当鼠标指针指向该按钮时,该按钮才会进行 3D 渲染,在正常情况下看起来像一个文本框;
④设置工具按钮样式、箭头工具按钮等功能。
python
#普通按钮功能
self.ui.T_btn01.setCheckable(True)
self.ui.T_btn01.toggled.connect(lambda: self.button_click(self.ui.T_btn01))
# 启用自动提升(扁平化样式,鼠标悬停时显示3D效果)
self.ui.T_btn02.setAutoRaise(True)
# 设置工具按钮样式(重要!)
self.ui.T_btn03.setIcon(QIcon(':/res/Resources/image/4.jpeg'))
self.ui.T_btn03.setToolButtonStyle(Qt.ToolButtonStyle.ToolButtonTextUnderIcon) # 文本在图标下
#箭头工具按钮
self.ui.T_btn04.setToolButtonStyle(Qt.ToolButtonStyle.ToolButtonTextUnderIcon)
self.ui.T_btn04.setArrowType(Qt.ArrowType.LeftArrow) #设置箭头方向

按钮的几种样式呈现方式如下表:
| ButtonStyle | 值 | 描 述 |
|---|---|---|
| Qt.ToolButtonStyle.ToolButtonIconOnly | 0 | 仅显示图标,默认状态 |
| Qt.ToolButtonStyle.ToolButtonTextOnly | 1 | 仅显示文字 |
| Qt.ToolButtonStyle.ToolButtonTextBesideIcon | 2 | 文本出现在图标旁边 |
| Qt.ToolButtonStyle.ToolButtonTextUnderIcon | 3 | 文本出现在图标下方 |
| Qt.ToolButtonStyle.ToolButtonFollowStyle | 4 | 遵循系统风格设置。在 UNIX 平台上,将使用桌面环境中的用户设置;在其他平台上仅显示图标 |
箭头的方向几种样现方式如下表:
| ButtonStyle | 值 | 描 述 |
|---|---|---|
| Qt.ArrowType.NoArrow | 0 | 没有箭头,默认状态 |
| Qt.ArrowType.UpArrow | 1 | 向上箭头 |
| Qt.ArrowType.DownArrow | 2 | 向下箭头 |
| Qt.ArrowType.LeftArrow | 3 | 向左箭头 |
| Qt.ArrowType.RightArrow | 4 | 向右箭头 |
2.高级特性
①菜单工具按钮功能;
②嵌入工具栏 QToolBar 中。
python
# 主菜单
self.main_menu = QMenu()
# 第一级菜单项
undo_action = QAction("撤销", self)
redo_action = QAction("重做", self)
# 创建"查找和替换"子菜单
find_replace_menu = QMenu("查找和替换")
# 子菜单项
find_action = QAction("查找", self)
replace_action = QAction("替换", self)
goto_action = QAction("转到", self)
find_replace_menu.addAction(find_action)
find_replace_menu.addAction(replace_action)
find_replace_menu.addAction(goto_action)
# 创建"格式"子菜单
format_menu = QMenu("格式")
# 格式子菜单项
font_action = QAction("字体", self)
font_action.setData("Font") # 设置标识数据
color_action = QAction("颜色", self)
color_action.setData("Color") # 设置标识数据
style_action = QAction("样式", self)
style_action.setData("Style") # 设置标识数据
format_menu.addAction(font_action)
format_menu.addSeparator()
format_menu.addAction(color_action)
format_menu.addSeparator()
format_menu.addAction(style_action)
# 将子菜单添加到主菜单
self.main_menu.addAction(undo_action)
self.main_menu.addAction(redo_action)
self.main_menu.addSeparator() #添加分割线
self.main_menu.addMenu(find_replace_menu) # 添加子菜单:cite[2]
self.main_menu.addMenu(format_menu) # 添加另一个子菜单
# 设置菜单到按钮
self.ui.T_btn05.setMenu(self.main_menu)
self.ui.T_btn05.setPopupMode(QToolButton.ToolButtonPopupMode.InstantPopup) #设置弹出模式
self.ui.T_btn05.triggered.connect(self.handle_menu_action)
# 添加到工具栏
self.ui.toolBar.addWidget(self.ui.T_btn05)
# 添加其他QAction按钮
new = QAction(QIcon(':/res/Resources/image/2.jpeg'), "new", self)
self.ui.toolBar.addAction(new)
def handle_menu_action(self, action):
# 获取动作信息
action_text = action.text()
action_data = action.data()
# 执行相应操作
self.ui.lab_Text.setText(f"触发的动作: {action_text}, 标识数据为:{action_data}")

工具按钮可以通过弹出菜单的方式提供其他选择,使用 setMenu()函数设置弹出的菜单,使用 setPopupMode()函数设置菜单显示的不同模式:
| 模 式 | 值 | 描 述 |
|---|---|---|
| QToolButton.ToolButtonPopupMode.DelayedPopup | 0 | 按住工具按钮一段时间后,显示菜单 |
| QToolButton.ToolButtonPopupMode.MenuButtonPopup | 1 | 在此模式下,工具按钮会显示一个特殊的箭头,提示存在菜单。按下按钮的箭头部分会显示菜单 |
| QToolButton.ToolButtonPopupMode.InstantPopup | 2 | 按下工具按钮后,将立即显示菜单。在此模式下,不会触发按钮本身的动作 |
总结与选择指南
| 需求场景 | 推荐按钮类型 | 关键特性 |
|---|---|---|
| 通用操作触发 | QPushButton | 文本、图标、样式丰富 |
| 工具栏操作 | QToolButton | 紧凑、多种显示样式、弹出菜单 |
| 单项选择 | QRadioButton | 互斥选择、分组管理 |
| 多项选择 | QCheckBox | 独立选择、支持三态 |
| 现代向导界面 | QCommandLinkButton | 美观、带描述文本 |
通过合理选择和配置不同的按钮控件,我们都可以创建出既美观又易用的用户界面。