我使用下面的代码动态创建了一组单选按钮:
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"发布于 2010-01-19 09:19:37
我相信它不工作的原因是你的
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"上面的代码应该遍历layout对象的子对象,检查它们的类型并打印“单选按钮...”以防它是无线电对讲机而且已经检查过了
希望这能有所帮助,致敬
发布于 2010-01-19 08:37:40
你的代码不是最小的和自包含的,所以它真的很难帮助你--但无论如何,我已经努力构建了一个近似于你想要做的事情的近乎最小的自包含近似,并且看起来工作正常--下面是...:
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中恢复它们--这种尝试似乎没有按预期工作,至少在正确访问有关给定单选按钮是否被选中的关键细节方面是如此,这当然是您的问题的核心。
发布于 2012-06-17 08:27:53
我认为识别哪个按钮被选中的更好方法是使用,因为它提供了一个容器来组织按钮小部件组。它不是一个可视对象,所以它不能替代布局来直观地排列单选按钮,但它确实允许您使它们相互排斥,并将一个整数"id“与它们关联起来,让您知道哪一个被检查了,而无需迭代布局中存在的所有小部件。
如果你决定使用它,你的代码应该变成这样:
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's checkedId方法:
buttonId = radioGroup.checkedId()或者,如果想要检索按钮对象本身,可以使用checkedButton方法:
button = radioGroup.checkedButton()https://stackoverflow.com/questions/2089897
复制相似问题