python - 在小部件 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() 来“打开或关闭它们”。
这样做可能会很快失控并且变得难以遵循,但就我而言,它很好并且不需要多种新方法就可以很好地工作,因为我只在两个地方需要它。
解决方案
您的问题与此非常相似
在布局中移除
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
删除布局参考这个问题
推荐阅读
- javascript - 我的彩色条的投票结果不起作用
- xpath - XPath 表达式捕获特定根目录下的所有嵌套文本
- java - 获取 Servlet:“AxisServlet”无法在 Weblogic 12c 中的 Web 应用程序 java.lang.StackOverflowError 中启动时预加载
- python - python keras:图像读取和加载
- pytorch - 如何使用 RoBERTa 执行多输出回归?
- javascript - 未以 Angular 9 反应形式设置动态验证
- xml - 取消注释 XML 文件
- javascript - 如何减少角度应用程序构建时间?
- listview - 如何从 SPFX 中的 Sharepoint 列表的特定视图中获取项目?
- sql - 每次卡车在 SQL 中没有速度时获取总时间?