在PyQt5

时间:2017-06-10 00:41:50

标签: python pyqt pyqt5 qwidget qslider

我想动态更改应用程序窗口中滑块的数量,具体取决于QStandardItemModel结构中已检查项目的数量。

我的应用程序窗口有一个名为QVBoxLayout的{​​{1}}实例,按下按钮时会更新该实例:

首先删除所有滑块:

sliders

然后创建一个新集。

相关代码:

self.sliders.removeWidget(slider)

这个原则似乎有效,但是发生的事情很奇怪,因为删除的滑块并没有真正消失,而是因为它们已经“断开连接”。从底层布局。

创建时,滑块在我调整主窗口大小时保持其他元素的位置。 然而,一旦他们被移除,他们占据固定的位置,并且如果我减小窗户的大小可以例如消失。 不幸的是,我在链接图片方面遇到了困难(当我尝试从粘贴板链接时,它说不支持该格式),所以我希望这个描述足以突出显示这个问题。

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

修改

感谢@eyllansec的回复,它汇总了围绕该主题的一堆其他回复,我无法找到,因为我不知道方法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) 这是获取的关键删除deleteLater()内的小部件。

我将它标记为我的选择(嘿,它是唯一的一个,毕竟它可以工作!),但是我想提出我自己的代码,它也适用于最小的变化w.r.t.我刚开始提出的建议。

这里的关键点是我使用的是我错误思考的metod QLayout,它会......躲开小部件!但实际上它的作用是(如果我理解正确的话)从布局实例中删除

这就是为什么它仍悬挂在我的窗口,虽然它似乎已经断开了

Manual reference

此外,建议的代码比我需要的更为通用,因为它是对布局内容的递归,原则上可以是其他QLayout.removeWidget(QWidget)对象或QLayout(或甚至{{ 1}}),并按层次结构组织(即QWidgets内的Qspacer QWidget等等。

check this other answer

从那里开始使用递归和一系列QLayout构造。

我的情况要简单得多,因为我使用这个QLayout实例来放置我的if-then,这就是全部。所以,对我来说,我现在坚持我的名单,因为我不喜欢QVLayout的形式主义而且我不需要它。我很高兴我在列表中构建的引用完全可以使用。

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

QSliders

1 个答案:

答案 0 :(得分:1)

没有必要将滑块保存在列表中,可以通过包含滑块的布局来访问它们。我已经实现了一个删除布局中元素的函数。解决方案如下:

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)