PyQt5中如何为QPushButton添加类似QRadioButton的单选可勾选功能
核心改动说明
- 每个QPushButton需要先调用
setCheckable(True)启用可勾选属性,默认该属性为关闭状态,直接调用setChecked()不会生效 - 借助
QButtonGroup组件管理所有需要互斥的按钮,其默认开启排他属性,加入组内的按钮会自动实现「选中一个其余自动取消选中」的逻辑,无需手动编写信号槽处理互斥 - 可通过QSS的
QPushButton:checked伪状态定义选中态的样式,选中状态切换时样式会自动生效
修正后可运行代码
from PyQt5.QtWidgets import * import sys class Window(QWidget): def __init__(self): QWidget.__init__(self) layout = QGridLayout() self.setLayout(layout) # 初始化按钮组,开启排他属性(默认即为True,此处显式声明更清晰) self.button_group = QButtonGroup(self) self.button_group.setExclusive(True) # 按钮1 btn1 = QPushButton("按钮1") btn1.setCheckable(True) btn1.setChecked(True) # 默认选中第一个 layout.addWidget(btn1, 0, 0) self.button_group.addButton(btn1) # 按钮2 btn2 = QPushButton("按钮2") btn2.setCheckable(True) layout.addWidget(btn2, 0, 1) self.button_group.addButton(btn2) # 按钮3 btn3 = QPushButton("按钮3") btn3.setCheckable(True) layout.addWidget(btn3, 0, 2) self.button_group.addButton(btn3) # 统一设置样式,区分选中和未选中状态 self.setStyleSheet(""" QPushButton { padding: 8px 16px; border: none; border-radius: 4px; color: white; background-color: rgb(49, 49, 49); } QPushButton:checked#btn1 { background-color: rgba(255, 0, 0, 0.61); } QPushButton:checked#btn2 { background-color: rgb(0, 255, 34); } QPushButton:checked#btn3 { background-color: rgb(100, 100, 100); } """) # 给按钮设置objectName匹配QSS规则 btn1.setObjectName("btn1") btn2.setObjectName("btn2") btn3.setObjectName("btn3") if __name__ == "__main__": app = QApplication(sys.argv) screen = Window() screen.show() sys.exit(app.exec_())
拓展说明
如果需要获取当前选中的按钮,可以调用按钮组的checkedButton()方法,也可以绑定buttonClicked信号监听选中变化。
内容的提问来源于stack exchange,提问作者Amanullah Amini
相关产品推荐
相关产品推荐

