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

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

  •  0
  • Pygmalion  · 技术社区  · 6 年前

    我想创建一个单选按钮数组,比如说10个,然后检查选中了哪些单选按钮。我是这样做的:

    a=QtWidgets.QHBoxLayout()
    for j in range(10):
        a.addWidget(QtWidgets.QRadioButton(str(j+1))
    

    检查选择了哪个单选按钮

    for j in a.children():
        if j.isChecked():
               print(j.text())
    

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

    我做错什么了?

    2 回复  |  直到 6 年前
        1
  •  1
  •   eyllanesc Yonghwan Shin    6 年前

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

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

    输出:

    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中是widget,因此QWidget可以有不是widget的子对象,但通常它们是QObject,因此使用children方法是获取子对象widget的一种不好的方法。

    如果你有一套 QRadioButton

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

    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_())
    
        2
  •  0
  •   Pygmalion    6 年前

    for j in range(10):
        if a.itemAt(j).widget().isChecked():
            print(a.itemAt(j).widget().text())