Почему радио считает родителем виджет подключенный к layout? И как получить имя для соседнего объекта?
Мой код:
from PyQt5 import QtWidgets, QtCore, QtGui
import sys
class Radio(QtWidgets.QWidget):
def __init__(
self,
parent=None,
):
super(Radio, self).__init__(parent)
lay = QtWidgets.QHBoxLayout(self)
self.radio_1 =QtWidgets.QRadioButton(self)
self.radio_2 =QtWidgets.QRadioButton(self)
lay.addWidget(self.radio_1)
lay.addWidget(self.radio_2)
class Child(QtWidgets.QWidget):
def __init__(
self,
num="none",
parent=None,
):
super(Child, self).__init__(parent)
self.rad = Radio(self)
self.setObjectName("child-{}".format(num))
self.label = QtWidgets.QLabel(parent)
self.label.setText("label-{}".format(num) )
setattr(parent, "label-{}".format(num), self.label)
self.label.setObjectName("label-{}".format(num))
self.label.move(num*100, 11)
class Parent(QtWidgets.QWidget):
def __init__(self):
super().__init__()
main = QtWidgets.QWidget(self)
main.setStyleSheet('background:red')
main.setObjectName(u"main")
main.resize(100, 100)
main.move(50,50)
lay = QtWidgets.QVBoxLayout(main)
self.group = QtWidgets.QButtonGroup(self, exclusive=True)
for x in range(2) :
wid = Child(x, self)
lay.addWidget(wid.rad)
wid.rad.radio_1.setObjectName("radio_1-{}".format(x))
wid.rad.radio_2.setObjectName("radio_2-{}".format(x))
self.group.addButton(wid.rad.radio_1, 0)
self.group.addButton(wid.rad.radio_2, 1)
self.group.buttonToggled.connect(self.fun)
def fun(self, but, state):
if state:
id = int(but.objectName().split('-')[1])
wid = getattr(self, "label-{}".format(id))
print('{}->{}'.format( but.objectName(), wid.objectName()))
wid = but.parent().parent()
print('{}->{}'.format( but.objectName(), wid.objectName()))
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
par = Parent()
par.resize(640, 570) #Size window
par.show()
sys.exit(app.exec_())
Да, я знаю, что он очень запутанный. Я просто использую его для экспериментов и для того, чтобы лучше понять как работает child и parend вложенные друг в друга объекты.
Вопрос в том, почему при запуске радио он считает своим родител main, а не child-{}
super(Radio, self).__init__(parent) назначает Child() своим родителем. или layout может перезаписывает родителя?
И как получить доступ к label-{} из функций fun
Упрощенная схема
Parent.Child-{1}.Radio.radio-{1}
#И
Parent.Child-{1}.Radio.radio-{2}
#Активирует
Parent.Child-{1}.label-{1}
#А
Parent.Child-{2}.Radio.radio-{1}
Parent.Child-{2}.Radio.radio-{2}
#Активирует
Parent.Child-{2}.label-{2}
#Но
Parent.Child-{1}.Radio.radio-{1}
#Почему-то активирует
Parent.main
Единственный способ который я знаю это записывать id в имя и после оброщатся к объекту по id.
Но мне кажется есть способ и получше.
Ответы (1 шт):
почему при запуске радио он считает своим родитель
mainа неchild-{}
потому что:
lay = QtWidgets.QVBoxLayout(main) # main
lay.addWidget(wid.rad)
как получить доступ к
label-{}из функцийfun
попробуйте так:
import sys
from PyQt5 import QtWidgets, QtCore, QtGui
class MyRadio(QtWidgets.QWidget):
def __init__(self, parent=None,):
super(MyRadio, self).__init__(parent)
self.setObjectName("myRadio")
self.lay = QtWidgets.QHBoxLayout(self)
self.radio_1 = QtWidgets.QRadioButton(f'radio_1 <- ({parent.objectName()})')
self.radio_1.setObjectName(f'radio_1 <- ({parent.objectName()})')
self.radio_2 = QtWidgets.QRadioButton(f'radio_2 <- ({parent.objectName()})')
self.radio_2.setObjectName(f'radio_2 <- ({parent.objectName()})')
self.lay.addWidget(self.radio_1)
parent.mysignal.emit(self.radio_1.objectName()) # +++ mysignal
self.lay.addWidget(self.radio_2)
parent.mysignal.emit(self.radio_2.objectName()) # +++ mysignal
class MyChild(QtWidgets.QWidget):
mysignal = QtCore.pyqtSignal(str) # +++ mysignal
def __init__(self, num=None, parent=None):
super(MyChild, self).__init__(parent)
self.setObjectName("myChild_{}".format(num))
self.parent = parent # +++
self.mysignal.connect(self.myDict) # +++ mysignal
self.label = QtWidgets.QLabel(self)
self.rad = MyRadio(self)
self.label.setText( "LABEL_{} <-> {}".format(num, self.objectName()) )
self.label.adjustSize()
self.label.setObjectName("label_{}".format(num))
print(f' label.parent=`{self.label.parent().objectName()}`, label.objectName=`{self.label.objectName()}`\n')
self.label.move(50+num*200, 11)
def myDict(self, rb): # +++ !!!
print(f' _myDict -> `{rb}`')
self.parent._myDict[rb] = self.label
class MyParent(QtWidgets.QWidget):
def __init__(self):
super().__init__()
self.setObjectName("myParent")
main = QtWidgets.QWidget(self)
main.setStyleSheet('background: red;')
main.setObjectName(u"main")
# main.resize(100, 100)
main.move(50,50)
lay = QtWidgets.QVBoxLayout(main)
self.group = QtWidgets.QButtonGroup(self, exclusive=True)
self._myDict = {} # +++ !!!
for x in range(2) :
wid = MyChild(x, self)
lay.addWidget(wid.rad)
self.group.addButton(wid.rad.radio_1, 0)
self.group.addButton(wid.rad.radio_2, 1)
self.group.buttonToggled.connect(self.fun)
def fun(self, but, state):
if state:
print(f'\n\t but.objectName=`{but.objectName()}`')
print(f'\t but.text=`{but.text()}`')
self._myDict[but.objectName()].setText(f'{but.objectName()}') # +++
self._myDict[but.objectName()].adjustSize() # +++
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
par = MyParent()
par.resize(400, 170)
par.show()
sys.exit(app.exec_())
