我想要创建一个数组,例如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()是[]。
我做错了什么?
发布于 2018-10-01 15:41:05
首先,布局不是视觉元素,它们是管理它们负责的小部件位置或其他布局的元素。另一方面,一个小部件只有当它是另一个小部件的子部件或者它是一个窗口时才是可见的。因此,当您将一个小部件添加到布局中时,该小部件的父部件将是创建布局的小部件。
为了验证,我将使用以下示例:
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,因此使用子方法是获取子部件的糟糕方法。
另外,如果在相同的布局中有一组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_())发布于 2018-10-02 14:46:37
经过一些异常疯狂的搜索,我找到了这个解决方案:
for j in range(10):
if a.itemAt(j).widget().isChecked():
print(a.itemAt(j).widget().text())https://stackoverflow.com/questions/52594018
复制相似问题