无法将具有QWidget和QVBoxLayout的QScrollArea创建到具有QVBoxLayout的QWidget

时间:2019-04-20 10:38:56

标签: python pyqt5

我有此代码:

class Window(QWidget):
    def __init__(self):
        super().__init__()

    def init_gui(self):
        self.layout = QVBoxLayout()
        self.setLayout(self.layout)

        self.new1()
        self.new2()

        self.showMaximized()

    def create_scroll_area(self):
        scroll_area = QScrollArea()
        widget = QWidget()
        scroll_area.setWidget(widget)
        layout = QVBoxLayout()
        widget.setLayout(layout)
        button = QPushButton("Ahoj")
        layout.addWidget(button)
        self.layout.addLayout(layout)

    def new1(self):
        self.create_scroll_area()

    def new2(self):
        self.create_scroll_area()

我收到此错误消息:

QLayout::addChildLayout: layout "" already has a parent

怎么了?

谁是布局的父母?小部件?我也尝试使用self.widget代替widget,但仍然无法正常工作。

1 个答案:

答案 0 :(得分:0)

请尝试使用此代码。

from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
import sys
class Window(QWidget):
    def __init__(self, parent=None):
        super().__init__(parent=None)
        self.init_gui()
    def init_gui(self):        
        self.create_scroll_area()
        self.showMaximized()        
    def create_scroll_area(self):
        scroll_area = QScrollArea()
        widget = QWidget()        
        layout = QVBoxLayout()        
        button = QPushButton("Ahoj")        
        layout.addWidget(button)
        widget.setLayout(layout)
        scroll_area.setWidget(widget)   
        self.setLayout(layout)
def main():
    app = QApplication([])
    window = Window()
    window.show()
    sys.exit(app.exec_())
if __name__ == "__main__":
    main()

让我们从A修改为Z。

1以在__init__构造函数中编写self.init_gui()。

如果不这样做,就无法在第一次执行init_gui方法。

2。setLayout()setWidget()应该至少写在最后一个位置。

在python中,我们准备要显示的内容,并将其设置在mainwidget上,并在最后一次显示。

3。请注意self.layout名称。

小部件最初具有setLayout()方法。和layout()方法。 如果使self.layout = ***,则会破坏QWidget的原始方法。

4。也可以删除new1new2方法。

请直接致电他们。

5。请查看create_scroll_area方法。

您制作了三个小部件。QScrollAreaQWidgetQPushButton。 并创建一个布局对象。然后将布局设置为QWidget。 但是,您需要在小部件设置布局之前设置QWidget。 这不是很好的编码顺序。

您创建了QPushButton,但该按钮不属于任何窗口小部件。 因为您确实将按钮设置在self.layout上,但是如果要显示它,则必须在最后一个位置setLayout(self.layout)