首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在多个QVBoxLayout中查找选中的QRadioButton

在多个QVBoxLayout中查找选中的QRadioButton
EN

Stack Overflow用户
提问于 2010-01-19 07:11:13
回答 3查看 8.8K关注 0票数 2

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

代码语言:javascript
复制
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)

如何遍历所有单选按钮以确定选中了哪个单选按钮?

我试过这样的东西,但我没有得到任何好处:

代码语言:javascript
复制
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"
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-01-19 09:19:37

我相信它不工作的原因是你的

代码语言:javascript
复制
 radio = QtGui.QRadioButton(child.widget())

在检查复选框是否被选中的代码处调用。我认为您要做的是将子对象类型转换为QtGui.QRadioButton,但它在这种情况下不起作用。相反,您应该创建一个新的小部件。尝试将其更改为smth。如下所示:

代码语言:javascript
复制
    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对象的子对象,检查它们的类型并打印“单选按钮...”以防它是无线电对讲机而且已经检查过了

希望这能有所帮助,致敬

票数 1
EN

Stack Overflow用户

发布于 2010-01-19 08:37:40

你的代码不是最小的和自包含的,所以它真的很难帮助你--但无论如何,我已经努力构建了一个近似于你想要做的事情的近乎最小的自包含近似,并且看起来工作正常--下面是...:

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

票数 4
EN

Stack Overflow用户

发布于 2012-06-17 08:27:53

我认为识别哪个按钮被选中的更好方法是使用,因为它提供了一个容器来组织按钮小部件组。它不是一个可视对象,所以它不能替代布局来直观地排列单选按钮,但它确实允许您使它们相互排斥,并将一个整数"id“与它们关联起来,让您知道哪一个被检查了,而无需迭代布局中存在的所有小部件。

如果你决定使用它,你的代码应该变成这样:

代码语言:javascript
复制
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方法:

代码语言:javascript
复制
buttonId = radioGroup.checkedId()

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

代码语言:javascript
复制
button = radioGroup.checkedButton()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2089897

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档