从pyqt中的框架中删除所有内容

时间:2014-10-06 08:06:00

标签: python layout pyqt pyqt4

有一些从布局中删除特定项目的示例,但我无法找到任何关于从框架中删除所有内容的内容。

使用pyqt设计器,我创建了一个框架。然后使用pyuic4将文件转换为python。在主程序中,一些布局,项目和小部件被动态插入到框架中。但是,我实际上并没有跟踪所有项目。在按钮刷新时,我想删除框架中包含的所有内容并再次填充它。

我的问题是,是否有一种简单的方法可以删除框架中包含的所有内容,包括布局,窗口小部件和项目。

截至目前,我可以这样做:

for i in range(len(MyResourceFrame.children())):
    MyResourceFrame.children()[i].deleteLater()

但是,我直接在其下面编码,在第一个qframe填充之后,单击repopulate会给出一个帧已经存在的错误,然后删除所有项目。第二次点击重新填充有效。这是否与“稍后”想要超出范围或仅仅是名称有关?

2 个答案:

答案 0 :(得分:2)

deleteLater广告位只会安排删除对象。也就是说,在控件返回到事件循环之前不会删除该对象(这通常意味着当前正在执行的函数返回之后)。

如果您想立即删除对象,请使用sip module。这应该允许您删除布局及其包含的所有小部件,如下所示:

import sip
...

class Window(QtGui.QMainWindow):
    ...

    def populateFrame(self):
        self.deleteLayout(self.frame.layout())
        layout = QtGui.QVBoxLayout(self.frame)
        ...

    def deleteLayout(self, layout):
        if layout is not None:
            while layout.count():
                item = layout.takeAt(0)
                widget = item.widget()
                if widget is not None:
                    widget.deleteLater()
                else:
                    self.deleteLayout(item.layout())
            sip.delete(layout)

答案 1 :(得分:0)

问题是QFrame中预定义的布局。如果您在QtDesigner中将其删除,则第一次单击后框架将正确显示。