第八节_PySide6基本窗口控件_按钮类控件(QAbstractButton)

文章目录

  • 前言
  • [一、按钮类控件(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 美观、带描述文本

通过合理选择和配置不同的按钮控件,我们都可以创建出既美观又易用的用户界面

本节源码路径为:PySide6基本窗口控件_按钮类控件(QAbstractButton)

相关推荐
百锦再4 小时前
对前后端分离与前后端不分离(通常指服务端渲染)的架构进行全方位的对比分析
java·开发语言·python·架构·eclipse·php·maven
Blossom.1185 小时前
把AI“刻”进玻璃:基于飞秒激光量子缺陷的随机数生成器与边缘安全实战
人工智能·python·单片机·深度学习·神经网络·安全·机器学习
Kratzdisteln5 小时前
【Python OOP Diary 1.1】题目二:简单计算器,改错与优化
python·面向对象编程
小白银子5 小时前
零基础从头教学Linux(Day 53)
linux·运维·python
skywalk81636 小时前
基于频域的数字盲水印blind-watermark
linux·开发语言·python
applepie_max6 小时前
GraphRAG本地部署 v2.7.0
python·rag·graphrag
sulikey6 小时前
从零配置一个规范的 Python Git 仓库(适用于 Gitee / GitHub)
git·python·pycharm·gitee·github
shaominjin1236 小时前
android在sd卡中可以mkdir, 但是不可以createNewFile
android·开发语言·python
我是华为OD~HR~栗栗呀7 小时前
华为od-22届考研-测试面经
java·c++·python·功能测试·华为od·华为·面试