Прежде всего, макеты не являются визуальными элементами, это элементы, которые управляют положением ответственных за них виджетов или других макетов.С другой стороны, виджет виден только в том случае, если он является дочерним элементом другого виджета или если это окно.Поэтому, когда вы добавляете виджет в макет, родительским элементом этого виджета будет виджет, в котором был создан макет.
Для проверки я буду использовать следующий пример:
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.
Очень простое и питоническое решение - использовать список для хранения виджетов:
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_())