从父布局向另一个布局添加布局 window
add a layout to another layout from the parent window
我是这个领域的新手,我希望这不是一个愚蠢的问题
我在 mac 上将 PyQt5 用于 Python 3.8
如果可能的话,我想将布局(addLayout)添加到父布局的另一个布局 window!
这是一个例子:我有一个 Class (ParentWindow),它有很多小部件和 hboxlayout。 (ChildWindow) 是一个 class 继承自 ParentWindow 并且它也有小部件和其他布局;问题:我可以在子 window 中添加布局吗?
如果我在 ChildWindow 中使用 setLayout,它会忽略它并显示消息:
(QWidget::setLayout: Attempting to set QLayout "" on ChildWindow ", which already has a layout) 那么,我可以对父 window 布局使用 addLayout 吗?以及如何
# The Parent Class
from PyQt5.QtWidgets import QWidget, QHBoxLayout,QLabel
class ParentWindow(QWidget):
def __init__(self):
super().__init__()
title = "Main Window"
self.setWindowTitle(title)
left = 000; top = 500; width = 600; hight = 300
self.setGeometry(left, top, width, hight)
MainLayoutHbox = QHBoxLayout()
header1 = QLabel("Header 1")
header2 = QLabel("Header 2")
header3 = QLabel("Header 3")
MainLayoutHbox.addWidget(header1)
MainLayoutHbox.addWidget(header2)
MainLayoutHbox.addWidget(header3)
self.setLayout(MainLayoutHbox)
# End of Parent Class
# The SubClass
from PyQt5.QtWidgets import QApplication, QVBoxLayout, QHBoxLayout, QTabWidget, QLabel
import sys
from ParentWindow import ParentWindow
class ChildWindow(ParentWindow):
def __init__(self):
super().__init__()
vbox = QVBoxLayout()
MainLabel= QLabel("My Window")
vbox.addWidget(MainLabel)
self.setLayout(vbox) # This show the Warning Error
# I assume the below code should work to extend the parent layout!! But it gives error
# parent.MainLayoutHbox.addLayout(vbox)
if __name__ == "__main__":
App = QApplication(sys.argv)
MyWindow= ChildWindow()
MyWindow.show()
App.exec()
ChildWindow 是一个 ParentWindow,也就是说,ChildWindow 在 ParentWindow 中具有预设属性,您可以在其中添加布局,并且使用 Z 代码可以添加布局,但是 Qt 告诉您:QWidget::setLayout : 试图在 ChildWindow "" 上设置 QLayout "",它已经有一个布局,这表明你已经有一个布局(你从父级继承的布局)。
如果您想通过另一个布局将 MainLabel 添加到预先存在的布局中,则必须使用 "layout()" 方法访问继承的布局并添加它:
class ChildWindow(ParentWindow):
def __init__(self):
super().__init__()
vbox = QVBoxLayout()
MainLabel= QLabel("My Window")
vbox.addWidget(MainLabel)
# self.layout() is MainLayoutHbox
self.layout().addLayout(vbox)
我是这个领域的新手,我希望这不是一个愚蠢的问题 我在 mac 上将 PyQt5 用于 Python 3.8 如果可能的话,我想将布局(addLayout)添加到父布局的另一个布局 window!
这是一个例子:我有一个 Class (ParentWindow),它有很多小部件和 hboxlayout。 (ChildWindow) 是一个 class 继承自 ParentWindow 并且它也有小部件和其他布局;问题:我可以在子 window 中添加布局吗? 如果我在 ChildWindow 中使用 setLayout,它会忽略它并显示消息: (QWidget::setLayout: Attempting to set QLayout "" on ChildWindow ", which already has a layout) 那么,我可以对父 window 布局使用 addLayout 吗?以及如何
# The Parent Class
from PyQt5.QtWidgets import QWidget, QHBoxLayout,QLabel
class ParentWindow(QWidget):
def __init__(self):
super().__init__()
title = "Main Window"
self.setWindowTitle(title)
left = 000; top = 500; width = 600; hight = 300
self.setGeometry(left, top, width, hight)
MainLayoutHbox = QHBoxLayout()
header1 = QLabel("Header 1")
header2 = QLabel("Header 2")
header3 = QLabel("Header 3")
MainLayoutHbox.addWidget(header1)
MainLayoutHbox.addWidget(header2)
MainLayoutHbox.addWidget(header3)
self.setLayout(MainLayoutHbox)
# End of Parent Class
# The SubClass
from PyQt5.QtWidgets import QApplication, QVBoxLayout, QHBoxLayout, QTabWidget, QLabel
import sys
from ParentWindow import ParentWindow
class ChildWindow(ParentWindow):
def __init__(self):
super().__init__()
vbox = QVBoxLayout()
MainLabel= QLabel("My Window")
vbox.addWidget(MainLabel)
self.setLayout(vbox) # This show the Warning Error
# I assume the below code should work to extend the parent layout!! But it gives error
# parent.MainLayoutHbox.addLayout(vbox)
if __name__ == "__main__":
App = QApplication(sys.argv)
MyWindow= ChildWindow()
MyWindow.show()
App.exec()
ChildWindow 是一个 ParentWindow,也就是说,ChildWindow 在 ParentWindow 中具有预设属性,您可以在其中添加布局,并且使用 Z 代码可以添加布局,但是 Qt 告诉您:QWidget::setLayout : 试图在 ChildWindow "" 上设置 QLayout "",它已经有一个布局,这表明你已经有一个布局(你从父级继承的布局)。
如果您想通过另一个布局将 MainLabel 添加到预先存在的布局中,则必须使用 "layout()" 方法访问继承的布局并添加它:
class ChildWindow(ParentWindow):
def __init__(self):
super().__init__()
vbox = QVBoxLayout()
MainLabel= QLabel("My Window")
vbox.addWidget(MainLabel)
# self.layout() is MainLayoutHbox
self.layout().addLayout(vbox)