参考文档:https://doc.qt.io/qtforpython-6/PySide6/QtWidgets/QButtonGroup.html
QButtonGroup的作用
从文档的详细描述中可以得到以下信息:
- 这是一个抽象的容器,当中可以放到一些按钮小部件
- 它只是管理按钮的状态,不负责显示
- 通过exclusive属性可以设置,QButtonGroup是否只能有一个按钮为选中状态,默认为True
- 可以通过setId(btn, id)函数为容器中的按钮关联一个整数,通过id(btn)获取关联的id.
- checkButton()或以获取被选中的按钮(只能返回一个,所以只能用于exclusive == True的情况),checkedId获得选中按钮的id.
- buttons函数可以返回容器器中的按钮。
QButtonGroup一般用于管理以下三种按钮:
- QPushButton它的属性checkable == Ture时,即它的实例调用了setCheckable(True)函数
- QRadioButton
- QCheckBox
独占示例
from PySide6.QtWidgets import QApplication,\
QWidget, QVBoxLayout, QHBoxLayout,\
QRadioButton, QLabel, QButtonGroup, \
QPushButton
class Window(QWidget):
def __init__(self):
super().__init__()
self.__set_up_ui()
def __set_up_ui(self):
v_box = QVBoxLayout(self)
v_box.addWidget(QLabel("你的职业是:"))
h_box = QHBoxLayout()
v_box.addLayout(h_box)
lst = [
QRadioButton("程序员"),
QRadioButton("程序媛"),
QRadioButton("程序猿"),
]
qbg = QButtonGroup(self)
self.qgb = qbg
_id = 1 for qrb in lst:
h_box.addWidget(qrb)
qbg.addButton(qrb, _id)
_id += 1
btn = QPushButton("获取职业")
btn.clicked.connect(lambda: print(self.qgb.checkedId()))
v_box.addWidget(btn)
app = QApplication([])
w = Window()
w.show()
app.exec()
非独占式
调用以下函数,使其成为非独占式。
qbg.setExclusive(False)
相应的QRadioButton改为:
lst = [
QCheckBox("程序员"),
QCheckBox("程序媛"),
QCheckBox("程序猿"),]
为了能获取选中的项,我们需要遍历buttons()判断按钮状态
class CheckBoxGroup(QButtonGroup):
def checkedId(self) -> list[int]:
lst = []
for btn in self.buttons():
if btn.isChecked():
lst.append(self.id(btn))
return lst
CheckBoxGroup重载了checkedId
完整代码如下:
from PySide6.QtWidgets import QApplication, QWidget, \QVBoxLayout, QHBoxLayout, QLabel, QButtonGroup, \
QPushButton, QCheckBox
class CheckBoxGroup(QButtonGroup):
def checkedId(self) -> list[int]:
lst = []
for btn in self.buttons():
if btn.isChecked():
lst.append(self.id(btn))
return lst
class Window(QWidget):
def __init__(self):
super().__init__()
self.__set_up_ui()
def __set_up_ui(self):
v_box = QVBoxLayout(self)
v_box.addWidget(QLabel("你的职业是:"))
h_box = QHBoxLayout()
v_box.addLayout(h_box)
lst = [
QCheckBox("程序员"),
QCheckBox("程序媛"),
QCheckBox("程序猿"),
]
qbg = CheckBoxGroup(self)
qbg.setExclusive(False)
self.qgb = qbg
_id = 1
for qrb in lst:
h_box.addWidget(qrb)
qbg.addButton(qrb, _id)
_id += 1
btn = QPushButton("获取职业")
btn.clicked.connect(lambda: print(self.qgb.checkedId()))
v_box.addWidget(btn)
app = QApplication([])
w = Window()
w.show()
app.exec()