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_())
代码解释:
- 普通按钮:
button1
是一个普通的QPushButton
,当用户点击它时,会触发button_clicked
函数,并且按钮在按下和释放后会立即恢复原状。- 对于
button1
,即使你调用button1.setChecked(True)
也不会有任何效果,因为它不是可检查的按钮。
- 可检查按钮:
button2
首先调用button2.setCheckable(True)
,将其变成可检查的按钮,此时它可以有选中和未选中状态。- 然后调用
button2.setChecked(True)
,将按钮初始化为选中状态。 - 当用户点击
button2
时,它会在选中和未选中状态之间切换,并触发button_toggled
函数,传递新的状态(True
或False
)。
四、原理说明:
- 在 PyQt5 中,
QPushButton
继承自QAbstractButton
,QAbstractButton
有setChecked()
和setCheckable()
方法。 setCheckable()
修改了按钮的属性,允许它存储和切换选中状态。setChecked()
实际上是在修改按钮的内部状态存储值(例如,一个布尔型变量),如果setCheckable()
没有被调用,这个存储值不会被使用,因为普通按钮不使用这个存储值,只有可检查按钮才会根据这个存储值来确定自己的显示和行为。
五、总结:
button.setCheckable(True)
是开启按钮的可检查属性,让按钮可以存储和切换选中状态。button.setChecked(True)
是设置按钮的选中状态,只有在按钮被设置为可检查后,该操作才有意义,因为只有可检查按钮才有选中和未选中的概念,才能在选中和未选中状态之间切换并保持状态。
总之,为了让 button.setChecked(True)
有效,你需要先将按钮设置为可检查的,以便它能够保持并显示你所设置的选中状态,同时使用 toggled
信号和相应的槽函数可以更好地处理按钮状态的变化,为用户提供更丰富的交互体验。
关于QPushButton优质学习资料如下:
PyQt5入门(二)--------按钮控件(PushButton)_pyqt5 button-CSDN博客