Проблема проста: макет может быть установлен только в виджете, чтобы лучше понять, вы должны знать, что:
lay = QXLayout(foowidet)
равно:
lay = QXLayout()
foowidget.setLayout(lay)
В вашем коде сначала вы указали, что buttonlayout обрабатывает дочерние виджеты myframe (self.buttonlayout = QVBoxLayout(self.myframe)
), но затем вы установили его для обработки дочерних элементов окна (self.addWidget(self.myframe)
.
Решение состоит в том, чтобы установить sh QFrame через макет:
class ButtonTest(QWidget):
def __init__(self):
super(ButtonTest, self).__init__()
self.button1 = QPushButton("Button 1")
self.button2 = QPushButton("Button 2")
self.myframe = QFrame()
self.myframe.setFrameShape(QFrame.StyledPanel)
self.myframe.setFrameShadow(QFrame.Plain)
self.myframe.setLineWidth(3)
buttonlayout = QVBoxLayout(self.myframe)
buttonlayout.addWidget(self.button1)
buttonlayout.addWidget(self.button2)
lay = QVBoxLayout(self)
lay.addWidget(self.myframe)