2

我使用下面的代码来动态创建一组单选按钮:

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"
4

3 回答 3

4

你的代码不是最小的和独立的,所以真的很难帮助你——但无论如何我已经努力建立一个几乎最小的独立近似值,你正在尝试做什么,看起来确实正常工作 - 这里来了......:

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 中恢复它们——这种尝试似乎没有按预期工作,至少在正确访问有关给定单选按钮是否为检查与否,这当然是你 Q 的核心。

于 2010-01-19T00:37:40.277 回答
1

我相信它不起作用的原因是你的

 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"

上面的代码应该遍历布局对象的子对象,检查它们的类型并打印“单选按钮...”,以防它是单选按钮并被选中

希望这会有所帮助,问候

于 2010-01-19T01:19:36.777 回答
0

我想识别哪个按钮被选中的更好方法是使用QButtonGroup,因为它提供了一个容器来组织按钮小部件组。它不是一个可视对象,因此它不能替代布局来直观地排列单选按钮,但它确实允许您使它们互斥并与它们关联一个整数“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 的 checkedId方法:

buttonId = radioGroup.checkedId()

或者,如果您想检索按钮对象本身,您可以使用checkedButton方法:

button = radioGroup.checkedButton()
于 2012-06-17T00:27:53.310 回答