【问题标题】:Remove everything from a frame in pyqt从pyqt中的框架中删除所有内容
【发布时间】:2014-11-30 11:15:48
【问题描述】:

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

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

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

到目前为止,我可以做到:

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

但是,我在其下直接有代码,在第一个 qframe 填充之后,单击重新填充会给出一个框架已经存在的错误,然后删除所有项目。第二次单击重新填充有效。这与“稍后”想要首先超出范围有关还是只是一个名称?

【问题讨论】:

  • 如果其他人有这个问题,使用答案中的 sip 和问题中的代码,它可以工作,但必须反转范围,以免删除数组中的项目,然后增加过去

标签: python layout pyqt pyqt4


【解决方案1】:

deleteLater 槽只会安排删除对象。也就是说,直到控制权返回到事件循环(这通常意味着当前执行的函数返回之后),对象才会被删除。

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

PyQt5

from PyQt5 import sip
...

class Window(QtWidgets.QMainWindow):
    ...

    def populateFrame(self):
        self.deleteLayout(self.frame.layout())
        layout = QtWidgets.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)

PyQt4

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)

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2018-06-13
      • 2018-09-04
      • 2018-01-29
      • 2014-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-27
      相关资源
      最近更新 更多