【问题标题】:Is there any way to remove a QWidget in a QGridLayout?有什么方法可以删除 QGridLayout 中的 QWidget?
【发布时间】:2012-11-01 19:36:10
【问题描述】:

我想要的是完全删除一个小部件(清除它,删除它,等等...),但它在一个网格布局中,所以即使调用removeWidget,它仍然保留一个指针,所以 python 不会想要移除对象。这是(剥离的)代码:

def addRow(self, row):
    self.entries.insert(row, QtGui.QLineEdit())
    self.gridlayout.addWidget(self.entries[row], row, 0)
...
def remRow(self, row):
    self.gridlayout.removeWidget(self.entries[row])
    del(self.entries[row])
...
(in another function)
foo.addRow(0)
foo.remRow(0)

它从网格布局中删除了小部件,但并没有完全删除它,所以它实际上被打包在(?)布局下方,并且小部件显然比布局大(虽然不确定,因为我看不到结束)。

再说一遍,有没有办法完全删除 QGridLayout 中的小部件?

提前致谢!

【问题讨论】:

    标签: python qt pyqt


    【解决方案1】:

    布局将小部件重新设置为容器的父级。因此,即使您从布局中删除它,容器小部件仍然是父级,因此不会删除该小部件。你应该调用 .deleteLater() 告诉 Qt 摆脱那个小部件(有效地清除小部件的所有引用,以便 Python 可以清除它):

    def remRow(self, row):
        self.gridlayout.removeWidget(self.entries[row])
        self.entries[row].deleteLater()
        del self.entries[row]
    

    【讨论】:

    • 从布局中显式删除并不是真正必要的,但如果你这样做了,你还应该隐藏小部件,以确保在 deleteLater 实际执行之前不会得到一个有趣的paintEvent。跨度>
    【解决方案2】:

    如果您想永久删除该小部件,只需将其删除即可。在 Python 中,您可能必须调用小部件的 deleteLater() 方法。 Qt 应该处理剩下的事情,比如从布局中删除它等。

    我不确定您问题中的 del 是做什么的,但显然它不会执行 C++ 删除。

    【讨论】:

    • “如果你想永远摆脱这个小部件,就删除它”,是的,这正是我的问题^_^
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-28
    • 2012-03-20
    相关资源
    最近更新 更多