Python Pyqt小部件在被删除后仍然存在
我有一个QVBox布局,其中包含一个QVBox布局和一个QHBox布局。我使用另一个QVBox布局来保存动态创建的GUI对象,使用QHBox布局来保存添加/删除这些对象的按钮。如果我将QHBox放在QVBox的顶部,一切都正常工作,但是当我尝试将QHBox放在QVBox的下面时,对象没有正确移除,而是停留在QHBox的顶部。我将上传图片来演示这个问题。第一张照片是在采取行动之前,第二张是在创建新对象之后,第三张是在删除对象之后 下面是创建和删除新对象的代码Python Pyqt小部件在被删除后仍然存在,python,user-interface,layout,pyqt,Python,User Interface,Layout,Pyqt,我有一个QVBox布局,其中包含一个QVBox布局和一个QHBox布局。我使用另一个QVBox布局来保存动态创建的GUI对象,使用QHBox布局来保存添加/删除这些对象的按钮。如果我将QHBox放在QVBox的顶部,一切都正常工作,但是当我尝试将QHBox放在QVBox的下面时,对象没有正确移除,而是停留在QHBox的顶部。我将上传图片来演示这个问题。第一张照片是在采取行动之前,第二张是在创建新对象之后,第三张是在删除对象之后 下面是创建和删除新对象的代码 def addClient(s
def addClient(self):
if (len(self.clients) < 5):
client = clientComponent(self)
self.clients.append(client)
index = len(self.clients)-1
self.vLayout3.addWidget(self.clients[index])
client.setIndex(index)
self.clients[index].startButton.clicked.connect(partial(self.threadcontrol, '2', client.getIndex()))
self.clients[index].stopButton.clicked.connect(partial(self.clientstop, '0', client.getIndex()))
def deleteClient(self):
if (len(self.clients) > 1):
self.vLayout3.removeWidget(self.clients.pop())
从布局中删除小部件时,它仍保留在父小部件的 ,因此它将显示在任何布局之外。 要从对象树中删除小部件,请调用widget.setParentNone。 widget.deleteLater也可以工作。 这是我的MCVEQt4,Py2.7:
from PyQt4.QtGui import (QApplication, QWidget, QPushButton,
QVBoxLayout, QHBoxLayout)
app=QApplication([])
self = QWidget()
main_layout = QVBoxLayout(self)
clients = []
l2 = QHBoxLayout()
main_layout.addLayout(l2)
b_add = QPushButton('add', self)
l2.addWidget(b_add)
def addClient():
b = QPushButton(str(len(clients)), self)
clients.append(b)
main_layout.addWidget(b)
b_add.clicked.connect(addClient)
b_rm = QPushButton('rm', self)
l2.addWidget(b_rm)
def deleteClient():
b = clients.pop()
main_layout.removeWidget(b)
# comment out two following lines to get the behavior you observe
b.setParent(None)
self.adjustSize()
b_rm.clicked.connect(deleteClient)
self.show()
app.exec_()
在我的系统上,我还必须在删除后调用self.adjustSize来调整主窗口的大小,这是因为从布局中删除客户端小部件后,主窗口仍然是它们的父窗口。如果将小部件分配给父小部件而不将其添加到任何布局中,您将看到类似的行为 删除父级应该可以解决此问题
def deleteClient(self):
if (len(self.clients) > 1):
client = self.clients.pop()
self.vLayout3.removeWidget(client)
client.setParent(None)
您可能还需要调用来调整窗口大小,以适合剩余的小部件来分析代码我需要您显示完整的代码
def deleteClient(self):
if (len(self.clients) > 1):
client = self.clients.pop()
self.vLayout3.removeWidget(client)
client.setParent(None)