在上一节中,介绍了QRadioButton单选按钮,后面遇到了分组的问题,前面是通过设置不同的区域作为父对象,进而实现分组,每组互不干扰,事实上,针对按钮的分组,有专门的QButtonGroup空间来实现。QButtonGroup提供一个抽象的按钮容器,将多个按钮分为一组。注意,这是一个抽象空间,也就是看不见。

虽然QButtonGroup看不见,但是在具有排他性的控件中,例如QRadioButton具有重要作用。

创建QButtonGroup和添加按钮addButton

  • 创建按钮组:QButtonGroup(parent)
  • 向组内添加按钮:addButton(按钮[, id=-1]) ,,id可以选择不写,id默认是-1表示系统自动分配一个id。如果自己指定id,注意避免冲突
# -*- coding: UTF-8 -*-
from PyQt5.Qt import *
import sys

# 创建一个应用
app = QApplication(sys.argv)
print(sys.argv)


# 创建一个QWidget类的窗口
window = QWidget()
window.setWindowTitle("按钮组")  # 标题
window.resize(500, 500)                     # 窗口的大小
window.move(400, 200)                       # 窗口初次显示的位置

# 创建其他控件
# 男女的QRadioButton
r_male = QRadioButton("男", window)
r_female = QRadioButton("女", window)
r_male.move(100, 100)
r_female.move(100, 150)

sex_group = QButtonGroup(window)
sex_group.addButton(r_male)
sex_group.addButton(r_female)

# 是否的QRadioButton
r_yes = QRadioButton("是", window)
r_no = QRadioButton("否", window)
r_yes.move(200, 100)
r_no.move(200, 150)

answer_group = QButtonGroup(window)
answer_group.addButton(r_yes)
answer_group.addButton(r_no)

window.show()                               # 显示窗口,不然啥也没有

sys.exit(app.exec_())

QButtonGroup抽象的分组

查看按钮_buttons() _button(ID)_checkedButton()

  • buttons() : 查看该按钮组里的所有按钮
  • button(ID):根据ID来获取对应按钮,没有则返回None
  • checkedButton():获取当前选中的那个按钮

这里说一说id,id其实就是给按钮组里的控件加上了一个标识。

# -*- coding: UTF-8 -*-
from PyQt5.Qt import *
import sys

# 创建一个应用
app = QApplication(sys.argv)
print(sys.argv)


# 创建一个QWidget类的窗口
window = QWidget()
window.setWindowTitle("按钮组")  # 标题
window.resize(500, 500)                     # 窗口的大小
window.move(400, 200)                       # 窗口初次显示的位置

# 创建其他控件
# 男女的QRadioButton
r_male = QRadioButton("男", window)
r_female = QRadioButton("女", window)
r_male.move(100, 100)
r_female.move(100, 150)

sex_group = QButtonGroup(window)
sex_group.addButton(r_male, 1)  # id设为1
sex_group.addButton(r_female)

r_male.setChecked(True)

# 是否的QRadioButton
r_yes = QRadioButton("是", window)
r_no = QRadioButton("否", window)
r_yes.move(200, 100)
r_no.move(200, 150)

answer_group = QButtonGroup(window)
answer_group.addButton(r_yes)
answer_group.addButton(r_no)

# 查看按钮
print(sex_group.buttons())
print(sex_group.button(1))
print(sex_group.checkedButton())

window.show()                               # 显示窗口,不然啥也没有

sys.exit(app.exec_())

移除按钮_removeButton()

和前面的添加按钮addButton相对应。

需要注意的是,这里的移除只是移除按钮与按钮组的关系,而不是在界面中删除按钮。

绑定和获取ID操作

设置ID,为了方便识别用户的选项。

可以通过向组内添加按钮的时候设置id。当然如果忘了,也可以再通过下面的方法进行绑定:

  • setId(按钮组里的按钮, ID号):给按钮组里的按钮设置ID
  • Id(按钮):获取按钮的ID,如果不存在,则返回-1
  • checkedId():获取选中的ID。如果不存在,则返回-1
# -*- coding: UTF-8 -*-
from PyQt5.Qt import *
import sys

# 创建一个应用
app = QApplication(sys.argv)
print(sys.argv)


# 创建一个QWidget类的窗口
window = QWidget()
window.setWindowTitle("按钮组")  # 标题
window.resize(500, 500)                     # 窗口的大小
window.move(400, 200)                       # 窗口初次显示的位置

# 创建其他控件
# 男女的QRadioButton
r_male = QRadioButton("男", window)
r_female = QRadioButton("女", window)
r_male.move(100, 100)
r_female.move(100, 150)

sex_group = QButtonGroup(window)
sex_group.addButton(r_male)  # id设为1
sex_group.addButton(r_female)

r_male.setChecked(True)

# 是否的QRadioButton
r_yes = QRadioButton("是", window)
r_no = QRadioButton("否", window)
r_yes.move(200, 100)
r_no.move(200, 150)

answer_group = QButtonGroup(window)
answer_group.addButton(r_yes)
answer_group.addButton(r_no)

# 绑定ID
answer_group.setId(r_yes, 1)
answer_group.setId(r_no, 2)

print(answer_group.id(r_yes))  # 查看r_yes的ID
print(answer_group.id(r_no))  # 查看r_yes的ID

window.show()                               # 显示窗口,不然啥也没有

sys.exit(app.exec_())

互斥/独占操作setExclusive(bool)

统一设置按钮组里的按钮是否是独占(选择互斥)

  • setExclusive(bool):设置按钮组里的按钮是否独占
  • exclusive():查看按钮组里是否设置了独占
# -*- coding: UTF-8 -*-
from PyQt5.Qt import *
import sys

# 创建一个应用
app = QApplication(sys.argv)
print(sys.argv)


# 创建一个QWidget类的窗口
window = QWidget()
window.setWindowTitle("按钮组")  # 标题
window.resize(500, 500)                     # 窗口的大小
window.move(400, 200)                       # 窗口初次显示的位置

# 创建其他控件
# 男女的QRadioButton
r_male = QRadioButton("男", window)
r_female = QRadioButton("女", window)
r_male.move(100, 100)
r_female.move(100, 150)

sex_group = QButtonGroup(window)
sex_group.addButton(r_male)  # id设为1
sex_group.addButton(r_female)

r_male.setChecked(True)

# 是否的QRadioButton
r_yes = QRadioButton("是", window)
r_no = QRadioButton("否", window)
r_yes.move(200, 100)
r_no.move(200, 150)

answer_group = QButtonGroup(window)
answer_group.addButton(r_yes)
answer_group.addButton(r_no)

# 独占操作
sex_group.setExclusive(False)   # 设置男女选项不互斥,可以同时选择
print(sex_group.exclusive())    # 查看按钮组是否独占

window.show()                               # 显示窗口,不然啥也没有

sys.exit(app.exec_())

可用的信号

  • buttonClicked(int/QAbstractButton) :当按钮被点击的时候发射信号
  • buttonPressed(int/QAbstractButton) :当按钮被按下的时候发射信号
  • buttonReleased(int/QAbstractButton) :当按钮被释放的时候发射信号
  • buttonToggled(int/QAbstractButton) :当按钮被切换状态的时候发射信号
# -*- coding: UTF-8 -*-
from PyQt5.Qt import *
import sys

# 创建一个应用
app = QApplication(sys.argv)
print(sys.argv)

# 创建一个QWidget类的窗口
window = QWidget()
window.setWindowTitle("按钮组")  # 标题
window.resize(500, 500)  # 窗口的大小
window.move(400, 200)  # 窗口初次显示的位置

# 创建其他控件
# 男女的QRadioButton
r_male = QRadioButton("男", window)
r_female = QRadioButton("女", window)
r_male.move(100, 100)
r_female.move(100, 150)

sex_group = QButtonGroup(window)
sex_group.addButton(r_male, 1)  # id设为1
sex_group.addButton(r_female, 2)  # id设为2

r_male.setChecked(True)

# 是否的QRadioButton
r_yes = QRadioButton("是", window)
r_no = QRadioButton("否", window)
r_yes.move(200, 100)
r_no.move(200, 150)

answer_group = QButtonGroup(window)
answer_group.addButton(r_yes)
answer_group.addButton(r_no)


# 可用信号
def test(val):
    print(sex_group.id(val))


sex_group.buttonClicked.connect(test)

window.show()  # 显示窗口,不然啥也没有

sys.exit(app.exec_())

博主个人公众号
版权声明 ▶ 本网站名称:陶小桃Blog
▶ 本文链接:https://www.52txr.cn/2022/QButtonGroup.html
▶ 本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长进行核实删除。
▶ 转载本站文章需要遵守:商业转载请联系站长,非商业转载请注明出处!!

最后修改:2022 年 08 月 16 日
如果觉得我的文章对你有用,请随意赞赏