在 PyQt5 上添加/删除 QSlider 小部件



我想根据QStandardItemModel结构中选中的项目数动态更改应用程序窗口上的滑块数量。

我的应用程序窗口有一个名为slidersQVBoxLayout实例,我在按下按钮时更新该实例:

首先删除所有滑块,最终删除其中:

self.sliders.removeWidget(slider)

然后创建一个新集合。

相关代码:

def create_sliders(self):
if len(self.sliders_list):
for sl in self.sliders_list:
self.sliders.removeWidget(sl)
self.sliders_list = []
for index in range(self.model.rowCount()):
if self.model.item(index).checkState():
slid = QSlider(Qt.Horizontal)
self.sliders.addWidget(slid)
self.sliders_list.append(slid)

该原理似乎有效,但是发生的事情很奇怪,因为删除的滑块并没有真正消失,而是因为它们与底层布局"断开连接"。

创建后,滑块会在我调整主窗口大小时保持它们在其他元素中的位置。 但是,一旦它们被删除,它们就会占据固定位置,例如,如果我减小窗口的大小,它们可能会消失。 不幸的是,我在链接图像时遇到困难(当我尝试从粘贴板链接时,它说不支持该格式),所以我希望这个描述足以突出这个问题。

我是否必须使用其他过程删除滑块?

编辑

感谢@eyllansec的回复,它围绕该主题压缩了一堆其他回复,我无法找到,因为我不知道方法deleteLater()这是摆脱QLayout内小部件的关键。

我将其标记为我选择的(嘿,毕竟它是唯一的一个并且它有效!),但是我想提出我自己的代码,该代码也可以对我开始时提出的内容进行最小的更改。

这里的关键点是我正在使用我错误地认为的 metodQLayout.removeWidget(QWidget)它会......的。。删除小部件!但实际上它的作用是(如果我理解正确的话)将其从布局实例中删除

这就是为什么它仍然挂在我的窗户上,尽管它似乎断开了

手册参考

此外,建议的代码比我需要的要通用得多,因为它是对布局内容的递归,原则上可以是其他QLayout对象或QWidgets(甚至Qspacer),并且可以组织在层次结构中(即,QLayout中的QWidgetQLayout等等)。

检查这个其他答案

从那里,使用递归和一系列if-then构造。

不过,我的情况要简单得多,因为我使用这个QVLayout实例来放置我的QSliders,这就是全部。所以,对我来说,我现在坚持我的清单,因为我不喜欢QLayout.TakeAt(n)的形式主义,我不需要它。我很高兴我在列表中构建的参考文献绝对可以使用。

最后,这是在这种情况下对我有用的略微更改的代码:

def create_sliders(self):
if len(self.sliders_list):
for sl in self.sliders_list:
sl.deleteLater()
self.sliders_list = []
for index in range(self.model.rowCount()):
if self.model.item(index).checkState():
slid = QSlider(Qt.Horizontal)
self.sliders.addWidget(slid)
self.sliders_list.append(slid)

不必将滑块保存在列表中,可以通过包含它的布局访问它们。我实现了一个删除布局中元素的功能。解决方案如下:

def create_sliders(self):
self.clearLayout(self.sliders)
for index in range(self.model.rowCount()):
if self.model.item(index).checkState():
slid = QSlider(Qt.Horizontal)
self.sliders.addWidget(slid)
def clearLayout(self, layout):
if layout:
while layout.count():
item = layout.takeAt(0)
widget = item.widget()
if widget:
widget.deleteLater()
else :
self.clearLayout(item.layout())
layout.removeItem(item)

相关内容

  • 没有找到相关文章

最新更新