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

时间:2018-10-01 15:08:49

标签: python pyqt pyqt5

我想创建一个由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 个答案:

答案 0 :(得分:1)

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

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

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中作为小部件,因此QWidget可以具有不是小部件的子级,但通常它们是QObject,因此使用children方法是获取子项的一种坏方法。儿童小部件。

如果您在同一版面中有一组QRadioButton,即,具有相同父级的是建立版面的小部件,则它们将是排他性的,因此只能按下。因此,为避免这种情况,我们将autoExclusive属性设置为False。

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

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 :(得分:0)

经过一些异常疯狂的搜索后,我得出了以下解决方案:

Auth::routes();


Route::post('password/reset','ResetPasswordController@reset');