第八节_PySide6基本窗口控件_按钮类控件(QAbstractButton)
文章目录
- 前言
- 一、按钮类控件(QAbstractButton) 简介
- 1.继承链关系
- 2.按钮类控件概览
- 二、常用函数和信号
- 1.QAbstractButton 类中常用的函数介绍
- 2.QAbstractButton 类中常用的信号介绍
- 三、QPushButton - 通用命令按钮
- 1.基础用法
- 2.高级特性
- 四、QRadioButton 、QCheckBox、QCommandLinkButton介绍
- 1.QRadioButton - 单选按钮
- 2.QCheckBox - 复选框
- 3.QCommandLinkButton - 现代命令链接
- 五、QToolButton - 工具栏专用按钮
- 1.基础功能
- 2.高级特性
- 总结与选择指南
前言
本节主要介绍基本窗口控件中的 按钮类控件(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()设置文本的基础用法;
#将按钮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.高级特性
①状态控制:将按钮设置自动重复(长按时重复触发)
# 将按钮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被触发了!!!"))
②图标与样式:通过样式表自定义外观
# 通过样式表自定义外观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键就有效
# 设置按钮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 已集成的组件。
#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 提供了一组带文本标签的复选框,用户可以从中选择多个选项。
#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 在特定场景下的替代品,在一般场景下没有必要使用。
#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 渲染,在正常情况下看起来像一个文本框;
④设置工具按钮样式、箭头工具按钮等功能。
#普通按钮功能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 中。
# 主菜单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 | 美观、带描述文本 |
通过合理选择和配置不同的按钮控件,我们都可以创建出既美观又易用的用户界面。
本节源码路径为:PySide6基本窗口控件_按钮类控件(QAbstractButton)