首页 > 解决方案 > 无法使用 QWidget 和 QVBoxLayout 创建 QScrollArea 到使用 QVBoxLayout 的 QWidget

问题描述

我有这个代码:

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.widgetwidget它仍然不起作用。

标签: pythonpyqt5

解决方案


请尝试此代码。

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名称。

Widget 有原来的setLayout()方法。和layout()方法。如果你让 self.layout = ***,你会粉碎QWidget.

4.也可以删除new1new2方法。

请直接打电话给他们。

5.请看create_scroll_area方法。

你做了三个小部件。QScrollArea, QWidget, QPushButton. 并制作一个布局对象。然后将布局设置为QWidget. 但是您QWidget在小部件设置布局之前设置了。编码顺序不好。

您制作QPushButton但按钮不属于任何小部件。因为你把按钮设置在了self.layout肯定的,但是如果你想显示它,你必须setLayout(self.layout)在最后一个位置。


推荐阅读