代码之家  ›  专栏  ›  技术社区  ›  Tiho

在QvBoxLayout中查找多个选中的QRadioButton

  •  2
  • Tiho  · 技术社区  · 16 年前

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

    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"
    
    3 回复  |  直到 14 年前
        1
  •  1
  •   serge_gubenko    16 年前

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

     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"
    

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

    希望这有帮助,问候

        2
  •  3
  •   Alex Martelli    16 年前

    您的代码不是最小的和自包含的,因此很难帮助您——但无论如何,我已经努力构建了一个近乎最小的自包含的近似值,这个近似值是您正在尝试做的事情,并且似乎可以正确地工作——这里是…:

    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中恢复它们——这种尝试似乎没有按预期工作,至少在正确访问有关给定单选按钮是否被选中的关键细节方面是如此,这当然是您的问题的核心。

        3
  •  0
  •   Claudio    14 年前

    我想确定选中哪个按钮的更好方法是使用 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)
    

    要识别选中的按钮,可以使用 qButnGrand的 棋盘 方法:

    buttonId = radioGroup.checkedId()
    

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

    button = radioGroup.checkedButton()