当前位置: 首页 > news >正文

PyQt5按钮类控件Button

一、PushButton

开发中经常会用到的功能:

        1.点击。
        2.设置默认按钮。
        3.设置按钮为可切换状态按钮。 

1.方法 

方法名称作用备注
setText(QString)设置按钮上的文字,参数值为字符串
text()获取按钮上的文字
setIcon(QIcon)设置按钮icon,参数值为QIcon对象
setIconSize(QSize)设置按钮icon图标大小,参数值为QSize对象
setShortcut()设置快捷键,传入对象为字符串,如button.setShortcut("Ctrl+Q")  设置快捷键为Ctrl+Q
setDefault(bool)设置按钮是否为默认按钮(默认按钮在回车键被按下时会激活),参数值传入布尔值

应用场景(见示例代码1):

1.对话框中的默认按钮

2.登录界面中的默认登录按钮

3.聊天界面中默认的发关按钮

4.表单提交中的默认操作

5.确认与取消操作中的默认选择

setCheckable(bool)设置按钮是否可以切换状态,一般同信号toggled配合使用。调用这个方法时,按钮就多了两种状态,即选中和未选中状态。参会传入布尔值。只有调用该方法后,使用setChecked(bool)和toggle()才有效。

应用场景(见示例代码2):

1.切换开关功能

2.多选功能

3.筛选功能

4.选项组功能

setChecked(bool)设置按钮的当前状态为选中或未选中,传入参数值为布尔值,必须同setCheckable(bool)配合使用

应用场景(见示例代码3):

1.初始化状态

2.单选按钮组中的默认选择

3.实现开关功能的初始状态

4.根据程序状态更新按钮状态

toggle()手动切换按钮的选中状态。在程序中手动调用 toggle() 方法,将按钮的状态切换一次。见示例代码4
isCheckable()检查按钮是否具有切换(即保持按下状态)的功能
isChecked()返回按钮的选中状态,如果未调用setCheckable(bool),该方法的返回值一直为False。
isEnabled()返回按钮是否可用
isDown()按钮是否被按下

系统总结代码:

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *class MyWin(QWidget):def __init__(self):super().__init__()self.resize(300, 320)self.setWindowTitle('按钮布局')# 1.创建按钮self.b11=QPushButton("按钮",self)self.b11.move(30,20)self.b12=QPushButton("2.是否可用",self)self.b12.move(160,20)self.b21=QPushButton("3.Ctlr+Q",self)self.b21.move(30,70)self.b22=QPushButton("4.icon",self)self.b22.move(160,70)self.b31=QPushButton("5.可选按钮",self)self.b31.move(30,120)self.b32=QPushButton("6.选中状态",self)self.b32.move(160,120)self.b41=QPushButton("7.切换状态",self)self.b41.move(30,170)self.b42=QPushButton("8.是否可切",self)self.b42.move(160,170)self.b51=QPushButton("9.是否选中",self)self.b51.move(30,220)self.b52=QPushButton("10.是否可用",self)self.b52.move(160,220)self.b61=QPushButton("11.是否按下",self)self.b61.move(30,270)self.b62=QPushButton("12.默认按钮",self)self.b62.move(160,270)# 设置文本/获取文本self.b11.setText("1.设置文本")text=self.b11.text()print(text)# 设置按钮是否可用self.b12.setEnabled(False)# 设置快捷键self.b21.setShortcut("Ctrl+Q")self.b21.clicked.connect(self.print)# 设置icon及尺寸self.b22.setIcon(QIcon('./LoadFile/ico.jpeg'))self.b22.setIconSize(QSize(20,20))# 设置按钮为是否可切换选中状态按钮self.b31.setCheckable(True)# 设置按钮处于选中状态self.b32.setCheckable(True)self.b32.setChecked(True)# 切换按钮状态self.b41.setCheckable(True)self.b41.setChecked(False)self.b41.toggle()# 返回按钮设置的可选属性的布尔值print(f'按钮8的是否可切换属性值:{self.b42.isCheckable()}')# 返回按钮是否被选中的状态self.b51.setCheckable(True)self.b51.setChecked(True)print(f"按钮9是否处于选中状态:{self.b51.isChecked()}")# 返回按钮是否可用的属性值print(f"按钮10是否可用状态:{self.b52.isEnabled()}")# 返回按钮是否被按下self.b61.pressed.connect(lambda :self.buttonIsDown(self.b61))self.b61.released.connect(lambda :self.buttonIsDown(self.b61))# 设置默认按钮self.b62.setDefault(True)self.b62.clicked.connect(self.sendInfo)def sendInfo(self):print("你好,默认按钮功能~~")def print(self):print('设置了快捷键~~')def state(self,a):print(f"按钮是否被按下:{a}")def buttonIsDown(self,button:QPushButton):if button.isDown():print(f"{button.text()}状态:按下~~")else:print(f"{button.text()}状态:松开~~")if __name__ == '__main__':app = QApplication(sys.argv)w = MyWin()qw=QWidget()w.show()app.exec()

示例代码1:

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QVBoxLayout, QDialog
def info():print('取消~~')def main():app = QApplication(sys.argv)dialog = QDialog()layout = QVBoxLayout(dialog)button1 = QPushButton("确定", dialog)layout.addWidget(button1)button2 = QPushButton("取消", dialog)button2.setDefault(True)button2.clicked.connect(info)layout.addWidget(button2)button3 = QPushButton("OK",dialog)layout.addWidget(button3)dialog.show()sys.exit(app.exec_())if __name__ == "__main__":main()

示例代码2:

(1)切换开关功能:
可以将 QPushButton 用作切换开关,例如在一个音乐播放器应用程序中,你可以使用一个可检查按钮来控制音乐的播放和暂停。当按钮被按下时,音乐开始播放,并且按钮保持按下状态(checked),当再次按下按钮时,音乐暂停,按钮恢复到未按下状态(unchecked)。python
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton
from PyQt5.QtGui import QIcon
import pygamedef toggle_music(state):if state:pygame.mixer.music.play()button.setIcon(QIcon("play_icon.png"))else:pygame.mixer.music.pause()button.setIcon(QIcon("pause_icon.png"))pygame.mixer.init()
pygame.mixer.music.load("music.mp3")app = QApplication(sys.argv)
window = QWidget()
button = QPushButton(window)
button.setIcon(QIcon("play_icon.png"))
button.setCheckable(True)
button.move(50, 50)
button.resize(50, 50)
button.toggled.connect(toggle_music)
window.show()
sys.exit(app.exec_())代码解释:
pygame.mixer.init() 和 pygame.mixer.music.load("music.mp3") 用于初始化和加载音乐文件。
button.setCheckable(True) 使按钮可检查,这样它可以在按下和未按下状态之间切换。
button.toggled.connect(toggle_music) 将按钮的 toggled 信号连接到 toggle_music 函数。
在 toggle_music 函数中,根据按钮的状态(state),播放或暂停音乐,并相应地更改按钮的图标。
(2)多选功能:
在一个任务管理应用程序中,可以使用多个可检查按钮来表示多个任务的选择状态。用户可以通过点击按钮来标记任务是否完成。python
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButtondef task_toggled(state):print(f"Task toggled: {state}")app = QApplication(sys.argv)
window = QWidget()
layout = QVBoxLayout(window)
button1 = QPushButton("Task 1")
button1.setCheckable(True)
button1.toggled.connect(task_toggled)
layout.addWidget(button1)
button2 = QPushButton("Task 2")
button2.setCheckable(True)
button2.toggled.connect(task_toggled)
layout.addWidget(button2)
window.show()
sys.exit(app.exec_())代码解释:
QVBoxLayout 用于垂直排列多个部件。
每个 QPushButton 都通过 button.setCheckable(True) 设置为可检查状态。
当用户点击按钮时,按钮的状态会切换,并且会调用 task_toggled 函数,打印出任务的状态。
(3)筛选功能:
在一个文件管理器应用程序中,可以使用可检查按钮来筛选文件类型。例如,用户可以点击一个按钮来筛选出所有的图片文件,再次点击可以取消筛选。python
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButtondef filter_files(state):if state:print("Filtering files...")else:print("Removing filter...")app = QApplication(sys.argv)
window = QWidget()
button = QPushButton("Filter Images")
button.setCheckable(True)
button.move(50, 50)
button.resize(100, 30)
button.toggled.connect(filter_files)
window.show()
sys.exit(app.exec_())代码解释:
button.setCheckable(True) 让按钮可以在按下和未按下状态之间切换。
button.toggled.connect(filter_files) 将按钮的 toggled 信号连接到 filter_files 函数。
当按钮状态改变时,filter_files 函数会根据按钮状态进行不同的操作,如开启或关闭文件筛选功能。
(4)选项组功能:
与 QButtonGroup 结合使用,创建一组互斥的可检查按钮,用户可以在一组选项中选择一个。python
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton, QButtonGroupdef option_selected(button):print(f"Selected option: {button.text()}")app = QApplication(sys.argv)
window = QWidget()
layout = QVBoxLayout(window)
button_group = QButtonGroup()
button1 = QPushButton("Option 1")
button1.setCheckable(True)
button_group.addButton(button1)
layout.addWidget(button1)
button2 = QPushButton("Option 2")
button2.setCheckable(True)
button_group.addButton(button2)
layout.addWidget(button2)
button_group.buttonClicked.connect(option_selected)
window.show()
sys.exit(app.exec_())代码解释:
QButtonGroup 用于管理一组按钮,确保同一时间只有一个按钮被选中。
每个 QPushButton 通过 button.setCheckable(True) 设为可检查。
button_group.buttonClicked.connect(option_selected) 将 QButtonGroup 的 buttonClicked 信号连接到 option_selected 函数,当用户点击按钮时,会调用 option_selected 函数,打印出选中的选项。
总之,button.setCheckable(True) 适用于需要在两种状态之间切换,并根据状态执行不同操作的场景,如开关、多选、筛选和选项组等,通过使用 toggled 信号和相应的槽函数,可以方便地处理按钮状态的变化,为用户提供更丰富的交互体验。

 示例代码3:

示例代码4:

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButtonapp = QApplication(sys.argv)
window = QWidget()
button = QPushButton("按钮", window)
button.move(50, 50)
# 设置按钮为可切换状态
button.setCheckable(True)
print(button.isChecked())
button.setChecked(True)
print(button.isChecked())
button.toggle()
print(button.isChecked())window.show()
sys.exit(app.exec_())

2.信号

信号名称说明备注
clicked按钮按下再释放时发出
pressed按钮被按下时发出
released按钮被释放时发出
toggled(bool)当按钮的切换状态发生变化时发出,参数 bool 表示新的状态

3.答疑

(1)setChecked(True)为什么必须同setCheckable(True)配合使用才有效

一、setCheckable(True) 的作用

  • button.setCheckable(True) 是用来将 QPushButton 转换为一个可检查的按钮。
  • 正常情况下,QPushButton 是一个普通的按钮,它只有按下和释放两种状态,按下时触发 clicked 信号,释放后恢复原状。
  • 当你调用 button.setCheckable(True) 时,你将这个按钮变成了一个可检查的按钮,它有了额外的两种状态:选中(checked)和未选中(unchecked)。这使得按钮可以保持在选中状态或未选中状态,而不仅仅是按下和释放的瞬间状态。

二、setChecked(True) 的作用

  • button.setChecked(True) 是用来设置按钮的选中状态为 True,即按钮处于选中状态。
  • 然而,如果 button 没有被设置为可检查(即没有调用 button.setCheckable(True)),那么 button.setChecked(True) 的操作是没有意义的,因为普通按钮没有选中和未选中的概念,它只关注点击操作。

三、代码示例

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButtondef button_clicked():print("Button clicked.")def button_toggled(state):print(f"Button toggled, state: {state}")app = QApplication(sys.argv)
window = QWidget()
# 创建一个普通的 QPushButton
button1 = QPushButton("Normal Button", window)
button1.move(50, 50)
button1.resize(100, 30)
button1.clicked.connect(button_clicked)# 创建一个可检查的 QPushButton
button2 = QPushButton("Checkable Button", window)
button2.move(50, 100)
button2.resize(120, 30)
button2.setCheckable(True)  # 使按钮可检查
button2.setChecked(True)  # 设置为选中状态
button2.toggled.connect(button_toggled)  # 连接 toggled 信号window.show()
sys.exit(app.exec_())

代码解释

  1. 普通按钮
    • button1 是一个普通的 QPushButton,当用户点击它时,会触发 button_clicked 函数,并且按钮在按下和释放后会立即恢复原状。
    • 对于 button1,即使你调用 button1.setChecked(True) 也不会有任何效果,因为它不是可检查的按钮。
  2. 可检查按钮
    • button2 首先调用 button2.setCheckable(True),将其变成可检查的按钮,此时它可以有选中和未选中状态。
    • 然后调用 button2.setChecked(True),将按钮初始化为选中状态。
    • 当用户点击 button2 时,它会在选中和未选中状态之间切换,并触发 button_toggled 函数,传递新的状态(True 或 False)。

四、原理说明

  • 在 PyQt5 中,QPushButton 继承自 QAbstractButtonQAbstractButton 有 setChecked() 和 setCheckable() 方法。
  • setCheckable() 修改了按钮的属性,允许它存储和切换选中状态。
  • setChecked() 实际上是在修改按钮的内部状态存储值(例如,一个布尔型变量),如果 setCheckable() 没有被调用,这个存储值不会被使用,因为普通按钮不使用这个存储值,只有可检查按钮才会根据这个存储值来确定自己的显示和行为。

五、总结

  • button.setCheckable(True) 是开启按钮的可检查属性,让按钮可以存储和切换选中状态。
  • button.setChecked(True) 是设置按钮的选中状态,只有在按钮被设置为可检查后,该操作才有意义,因为只有可检查按钮才有选中和未选中的概念,才能在选中和未选中状态之间切换并保持状态。

总之,为了让 button.setChecked(True) 有效,你需要先将按钮设置为可检查的,以便它能够保持并显示你所设置的选中状态,同时使用 toggled 信号和相应的槽函数可以更好地处理按钮状态的变化,为用户提供更丰富的交互体验。

关于QPushButton优质学习资料如下:

PyQt5入门(二)--------按钮控件(PushButton)_pyqt5 button-CSDN博客

二、RadioButton

三、CheckBox

四、ToolButton

五、CommandLinkButton

六、DialogButtonBox


http://www.mrgr.cn/news/83539.html

相关文章:

  • 如何备考PostgreSQL中级认证
  • Oracle Dataguard(主库为双节点集群)配置详解(4):配置备库
  • WordPress开发进群V2主题,多种引流方法,引私域二次变现
  • 【Ubuntu与Linux操作系统:三、用户与组管理】
  • JS爬虫实战演练
  • 【强化学习】演员评论家Actor-Critic算法(万字长文、附代码)
  • 信息科技伦理与道德3:智能决策
  • Picocli 命令行框架
  • Virsh虚拟机连接校园网
  • Elasticsearch:使用 Playground 与你的 PDF 聊天
  • 51c~Pytorch~合集5
  • 宝塔面板 php8.0 安装 fileinfo 拓展失败
  • 继续以“实用”指导Pythonic编码(re通配表达式)(2024年终总结2)
  • Android系统定制APP开发_如何对应用进行系统签名
  • LeetCode热题100-环形链表【JavaScript讲解】
  • 补种未成活胡杨
  • 对话新晋 Apache SeaTunnel Committer:张圣航的开源之路与技术洞察
  • HarmonyOS Next系列之华为账号一键登录功能实现(十四)
  • shell脚本回顾1
  • 【Ubuntu 24.04】虚拟机常见问题解决
  • rk3568 内核态OOM内存泄漏memleak使用
  • 分类模型为什么使用交叉熵作为损失函数
  • Spring——几个常用注解
  • mybatis分页插件:PageHelper、mybatis-plus-jsqlparser(解决SQL_SERVER2005连接分页查询OFFSET问题)
  • 【leetcode刷题】:双指针篇(有效三角形的个数、和为s的两个数)
  • 文献阅读分享:XSimGCL - 极简图对比学习在推荐系统中的应用