Поиск проверенных QRadioButton среди многих в QVBoxLayout - PullRequest
2 голосов
/ 19 января 2010

Я использовал приведенный ниже код для динамического создания группы радиокнопок:

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 ]

3 голосов
/ 19 января 2010

Ваш код не является минимальным и самодостаточным, поэтому вам действительно трудно помочь - но я все равно приложил усилия для построения почти минимального самодостаточного приближения того, что вы пытаетесь сделать, икоторый, кажется, работает правильно - вот идет ...:

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.

1 голос
/ 19 января 2010

Я считаю, что причина, по которой он не работает - ваша

 radio = QtGui.QRadioButton(child.widget())

позвоните по коду, где вы проверяете, установлен ли ваш флажок. Я думаю, что вы пытаетесь типизировать дочерний объект к QtGui.QRadioButton, и в этом случае он не работает. Вместо этого вы должны создавать новый виджет. Попробуйте изменить это на что-л. как это:

    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"

приведенный выше код должен перебирать дочерние объекты объекта макета, проверять их тип и печатать «радио-кнопку ...», если это радио-кнопка и она отмечена

надеюсь, это поможет, с уважением

0 голосов
/ 17 июня 2012

Полагаю, лучший способ определить, какая кнопка отмечена, - это использовать 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()
...