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()

これはあなたが望むことをするようです。重要な変更は、実際のP​​ythonウィジェットオブジェクトをレイアウト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 に答える