Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在小部件PyQt5上设置布局后更改布局_Python_Pyqt5 - Fatal编程技术网

Python 在小部件PyQt5上设置布局后更改布局

Python 在小部件PyQt5上设置布局后更改布局,python,pyqt5,Python,Pyqt5,我有一个QStackedWidget对象,其中添加了三个不同的QWidget。我初始化了每个布局,并在程序启动时相应地设置它们。然而,当用户操作其中一个的数据时,在另一个上表示的数据可能会改变。我已经编写了工作函数来在状态更改时更改布局,但它从未更新QWidget.setLayout()调用首次发生时设置的布局 class UI(self): def __init__(self): #create baseLayout #create emptyLayou

我有一个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的了解还只是几个月,还不是它的高手,所以如果有更好的方法,我会洗耳恭听

编辑:我在这个小博客上找到了答案,所以我在这里分享

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


这样做可能会很快失去控制,很难理解,但对于我来说,这很好,而且不需要多种新方法,因为我只需要两个地方。

你的问题与

在布局中删除

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 
添加布局

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 
在布局中添加布局的步骤

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 
删除布局的步骤
参考此

请提供一个经过编辑的粗略示例,我不完全确定我是否遵循此示例。你是说从一个布局更改到另一个布局的正确方法是删除当前布局,然后添加新布局?是的,这就是我目前所知道的。可能还有其他方法,但这是我认为最安全的方法。所以我实现了这一点,虽然它在第一次从一个布局切换到另一个布局时起作用,但之后前一个布局无法访问,因为它已被删除。我之前尝试过引用布局,这样我可以再次使用它,但这似乎也不起作用。你能写一个伪代码吗?你是如何改变函数中的布局的?因为有一种可能性,当您引用布局时,它可能只是替换旧的布局。您是否尝试在列表中保存布局
listLayout.append(layout1)
并像这样分配每次
self.layout.addLayout(listLayout[0])
我就是这么做的。最初我只是使用{self.layout.addLayout(self.baseLayout)}不管怎样,它都会给出相同的结果。在查看每个版面后,由于所有版面项目都已删除,因此不会显示任何内容。是否有某种方法可以在不首先从布局中删除小部件的情况下清除布局?