首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从qRadioButton中的qRadioButton数组中获取选定的QHBoxLayout

如何从qRadioButton中的qRadioButton数组中获取选定的QHBoxLayout
EN

Stack Overflow用户
提问于 2018-10-01 15:08:49
回答 2查看 628关注 0票数 0

我想要创建一个数组,例如10,单选按钮,然后检查哪个单选按钮被选中。我就是这样做的:

创建单选按钮数组

代码语言:javascript
复制
a=QtWidgets.QHBoxLayout()
for j in range(10):
    a.addWidget(QtWidgets.QRadioButton(str(j+1))

检查选择了哪个单选按钮

代码语言:javascript
复制
for j in a.children():
    if j.isChecked():
           print(j.text())

它从不返回任何文本,而且a.children()[]

我做错了什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-10-01 15:41:05

首先,布局不是视觉元素,它们是管理它们负责的小部件位置或其他布局的元素。另一方面,一个小部件只有当它是另一个小部件的子部件或者它是一个窗口时才是可见的。因此,当您将一个小部件添加到布局中时,该小部件的父部件将是创建布局的小部件。

为了验证,我将使用以下示例:

代码语言:javascript
复制
app = QtWidgets.QApplication(sys.argv)
w = QtWidgets.QWidget()
lay = QtWidgets.QHBoxLayout(w)
for j in range(10):
    lay.addWidget(QtWidgets.QRadioButton(str(j+1)))
print("children of layout: ", lay.children())
print("children of widget: ", w.children())
w.show()
sys.exit(app.exec_())

输出:

代码语言:javascript
复制
children of layout:  []
children of widget:  [<PyQt5.QtWidgets.QHBoxLayout object at 0x7fbf0ee2d288>, <PyQt5.QtWidgets.QRadioButton object at 0x7fbf0ee2d1f8>, <PyQt5.QtWidgets.QRadioButton object at 0x7fbf0ee2d168>, <PyQt5.QtWidgets.QRadioButton object at 0x7fbf0ee2d0d8>, <PyQt5.QtWidgets.QRadioButton object at 0x7fbf0ee2d048>, <PyQt5.QtWidgets.QRadioButton object at 0x7fbf0ee2d828>, <PyQt5.QtWidgets.QRadioButton object at 0x7fbf0ee2d8b8>, <PyQt5.QtWidgets.QRadioButton object at 0x7fbf0e860d38>, <PyQt5.QtWidgets.QRadioButton object at 0x7fbf0e860dc8>, <PyQt5.QtWidgets.QRadioButton object at 0x7fbf0e860e58>, <PyQt5.QtWidgets.QRadioButton object at 0x7fbf0e860ee8>]

如您所见,布局没有子部件,但是w小部件作为子部件有添加到布局中的小部件,因为布局是在w内建立的。

另一方面,子部件作为小部件存在于QObject中,因此QWidget可以有不是小部件的子部件,但通常它们是QObject,因此使用子方法是获取子部件的糟糕方法。

另外,如果在相同的布局中有一组QRadioButton (即具有相同的父级,也就是创建布局的小部件),那么这些内容将是排他性的,因此只能按下。因此,为了避免这种情况,我们将autoExclusive属性设置为False。

一个非常简单的pythonic解决方案是使用一个列表来存储小部件:

代码语言:javascript
复制
import sys
from PyQt5 import QtCore, QtWidgets


class Widget(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(Widget, self).__init__(parent)

        hlay = QtWidgets.QHBoxLayout()
        self.radio_buttons = []
        for j in range(10):
            btn = QtWidgets.QRadioButton(str(j+1))
            btn.setAutoExclusive(False)
            hlay.addWidget(btn)
            self.radio_buttons.append(btn)

        lay = QtWidgets.QVBoxLayout(self)
        button = QtWidgets.QPushButton("Press me")
        button.clicked.connect(self.on_clicked)
        lay.addWidget(button)
        lay.addLayout(hlay)

    @QtCore.pyqtSlot()
    def on_clicked(self):
        for btn in self.radio_buttons:
            if btn.isChecked():
                print(btn.text())


if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    w = Widget()
    w.show()
    sys.exit(app.exec_())
票数 1
EN

Stack Overflow用户

发布于 2018-10-02 14:46:37

经过一些异常疯狂的搜索,我找到了这个解决方案:

代码语言:javascript
复制
for j in range(10):
    if a.itemAt(j).widget().isChecked():
        print(a.itemAt(j).widget().text())
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52594018

复制
相关文章

相似问题

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