有一些从布局中删除特定项目的示例,但我无法找到任何关于从框架中删除所有内容的内容。
使用pyqt设计器,我创建了一个框架。然后使用pyuic4将文件转换为python。在主程序中,一些布局,项目和小部件被动态插入到框架中。但是,我实际上并没有跟踪所有项目。在按钮刷新时,我想删除框架中包含的所有内容并再次填充它。
我的问题是,是否有一种简单的方法可以删除框架中包含的所有内容,包括布局,窗口小部件和项目。
截至目前,我可以这样做:
for i in range(len(MyResourceFrame.children())):
MyResourceFrame.children()[i].deleteLater()
但是,我直接在其下面编码,在第一个qframe填充之后,单击repopulate会给出一个帧已经存在的错误,然后删除所有项目。第二次点击重新填充有效。这是否与“稍后”想要超出范围或仅仅是名称有关?
答案 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中将其删除,则第一次单击后框架将正确显示。