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