首页 > 解决方案 > 在小部件 PyQt5 上设置布局后更改布局

问题描述

我有一个 QStackedWidget 对象,其中添加了三个不同的 QWidget。我为每一个初始化布局,并在程序启动时相应地设置它们。然而,当用户操作来自一个的数据时,另一个表示的数据可能会发生变化。我已经编写了工作函数来在状态更改时更改布局,但它永远不会从第一次发生 QWidget.setLayout() 调用时设置的布局更新。

class UI(self):
    def __init__(self):
        #create baseLayout
        #create emptyLayout
        self.layout = baseLayout

    def updateLayout(self):
        if empty:
            self.layout = emptyLayout
        else:
            self.layout = baseLayout

class MainWindow(self):
    def __init__(self, UI):
        self.centerWidget = QStackedWidget()
        self.childWidget = QWidget()
        self.childWidget.setLayout(UI.layout)
        self.centerWidget.addWidget(childWidget)

所以在上面的例子中,如果调用了 updateLayout() 函数并将 UI 的布局更改为 emptyLayout,它不会改变它在选择 childWidget 时的显示方式。

我想 .setLayout 并不意味着随着布局本身的变化而更新,但是还有其他方法可以解决这个问题吗?我仍然只有几个月的时间进入 PyQt5 并且不是它的大师,所以如果有更好的方法来做到这一点,我会全力以赴。

编辑:我在这个小型博客网站上遇到了答案,所以我在这里分享。https://myprogrammingnotes.com/remove-layout.html

缺点是 QLayout 的复制构造函数是私有的,找到保存对布局的引用的方法远非易事。他建议以这种方式设置所需的布局以附加到他们自己的小部件,然后使用 .setVisible() 来“打开或关闭它们”。

这样做可能会很快失控并且变得难以遵循,但就我而言,它很好并且不需要多种新方法就可以很好地工作,因为我只在两个地方需要它。

标签: pythonpyqt5

解决方案


您的问题与此非常相似

在布局中移除

item=self.layout.takeAt(#widgetitem index to take out)
self.layout.removeItem(item)

添加布局

self.layout.addItem(QLabel("new item"))

在布局中添加布局

self.layout.addLayout(baseLayout) # to add into a layout (make sure if its horizontally layout or vertical layout because it will be added accordingly 

删除布局参考这个问题


推荐阅读