Python 在QVBoxLayout中查找多个选中的QRadioButton
我使用下面的代码动态创建了一组单选按钮:Python 在QVBoxLayout中查找多个选中的QRadioButton,python,qt,pyqt4,Python,Qt,Pyqt4,我使用下面的代码动态创建了一组单选按钮: self.wPaymantType.qgbSomeSelectionGroup = QtGui.QGroupBox() vbox = QtGui.QVBoxLayout() for row in listOfChoices: radio = QtGui.QRadioButton(row) if bIsFirst: radio.setChecked(True) bIsFirst = False if
self.wPaymantType.qgbSomeSelectionGroup = QtGui.QGroupBox()
vbox = QtGui.QVBoxLayout()
for row in listOfChoices:
radio = QtGui.QRadioButton(row)
if bIsFirst:
radio.setChecked(True)
bIsFirst = False
if len(row.name) > nMaxLen:
nMaxLen = len(row.name)
vbox.addWidget(radio)
self.wPaymantType.qgbSomeSelectionGroup.setLayout(vbox)
如何遍历所有单选按钮以确定选中了哪一个
我尝试过这样的东西,但没有得到任何好处:
qvbl = self.qgbSomeSelectionGroup.children()[0]
for i in range(0, qvbl.count()):
child = qvbl.itemAt(i)
radio = QtGui.QRadioButton(child.widget())
if radio != None:
if radio.isChecked():
print "radio button num " + str(i) + " is checked"
您的代码不是最小的、自包含的,因此很难帮助您--但无论如何,我已经努力构建了一个几乎最小的、自包含的近似值,该近似值表示您正在尝试执行的操作,并且看起来确实正确--下面是…:
from PyQt4 import QtGui
import sys
class MainWindow(QtGui.QMainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
self.dowid()
self.setCentralWidget(self.thewid)
def dowid(self):
self.thewid = QtGui.QGroupBox()
vbox = QtGui.QVBoxLayout()
self.radiobuttons = []
listOfChoices = 'one two three'.split()
for i, row in enumerate(listOfChoices):
radio = QtGui.QRadioButton(row)
if i == 0:
radio.setChecked(True)
self.radiobuttons.append(radio)
vbox.addWidget(radio)
self.thewid.setLayout(vbox)
def examine(self):
for i, radio in enumerate(self.radiobuttons):
if radio.isChecked():
print "radio button num " + str(i) + " is checked"
else:
print "radio button num " + str(i) + " is NOT checked"
if __name__ == '__main__':
app = QtGui.QApplication([])
mainWin = MainWindow()
mainWin.show()
rc = app.exec_()
mainWin.examine()
这似乎是你想要的。关键的变化是保留实际的Python小部件对象,而不是试图从布局vbox中恢复它们——这种尝试似乎没有按预期的方式工作,至少在正确访问有关是否选中给定单选按钮的关键细节方面是如此,这当然是你问题的核心。我相信它不起作用的原因是你的
radio = QtGui.QRadioButton(child.widget())
在检查复选框是否已选中的代码处调用。我认为您要做的是将子对象类型转换为QtGui.QRadioButton,但在本例中它不起作用。相反,您应该创建一个新的小部件。尝试将其更改为smth。像这样:
qvbl = self.qgbSomeSelectionGroup.layout()
for i in range(0, qvbl.count()):
widget = qvbl.itemAt(i).widget()
if (widget!=0) and (type(widget) is QtGui.QRadioButton):
if widget.isChecked():
print "radio button num " + str(i) + " is checked"
self.wPaymantType.qgbSomeSelectionGroup = QtGui.QGroupBox()
vbox = QtGui.QVBoxLayout()
radioGroup = QtGui.QButtonGroup()
radioGroup.setExclusive(True)
for i,row in enumerate(listOfChoices):
radio = QtGui.QRadioButton(row)
radioGroup.addButton(radio, i)
if bIsFirst:
radio.setChecked(True)
bIsFirst = False
if len(row.name) > nMaxLen:
nMaxLen = len(row.name)
vbox.addWidget(radio)
self.wPaymantType.qgbSomeSelectionGroup.setLayout(vbox)
上面的代码应该遍历布局对象的子对象,检查它们的类型并打印“单选按钮…”,以防它是单选按钮并且被选中
希望这能有所帮助,关于我想确定选中哪个按钮的更好方法是使用,因为它提供了一个容器来组织按钮小部件组。它不是一个可视对象,因此它不会用布局来代替直观地排列单选按钮,但它确实允许您使它们相互排斥,并将一个整数“id”与它们关联起来,让您知道选中了哪一个,而无需迭代布局中的所有小部件 如果您决定使用它,您的代码应该变成这样:
qvbl = self.qgbSomeSelectionGroup.layout()
for i in range(0, qvbl.count()):
widget = qvbl.itemAt(i).widget()
if (widget!=0) and (type(widget) is QtGui.QRadioButton):
if widget.isChecked():
print "radio button num " + str(i) + " is checked"
self.wPaymantType.qgbSomeSelectionGroup = QtGui.QGroupBox()
vbox = QtGui.QVBoxLayout()
radioGroup = QtGui.QButtonGroup()
radioGroup.setExclusive(True)
for i,row in enumerate(listOfChoices):
radio = QtGui.QRadioButton(row)
radioGroup.addButton(radio, i)
if bIsFirst:
radio.setChecked(True)
bIsFirst = False
if len(row.name) > nMaxLen:
nMaxLen = len(row.name)
vbox.addWidget(radio)
self.wPaymantType.qgbSomeSelectionGroup.setLayout(vbox)
要识别选中的按钮,可以使用QButtonGroup的checkedId方法:
或者,如果要检索按钮对象本身,可以使用checkedButton方法:
谢谢,这个看起来可以用。我感谢你的帮助!非常感谢你的努力。我稍后会试试这个。