单击按钮,QTabWidget将添加一个选项卡(患者对象)。
这是我的设计方式。
首先,模型在获取数据以显示数据后,请求网络调用患者方法。
第二,患者将积极使用模型中的数据。
因此,我定义了self.model = Model()和self.view = view,但这产生了一个问题。患者和模型相互参照,这将导致内存泄漏。因此,当我关闭选项卡时,我必须删除Patient.model。属性,以便它们不再彼此引用,并且内存泄漏的问题已解决。
但是,在我的项目中,在很多情况下,视图和模型相互引用。我需要找到它们,然后在关闭选项卡时关闭它们之间的关系。我认为这种设计在内存泄漏方面有点弱。您能给我一些更好的设计建议吗?非常感谢。
import sys
from PyQt4 import QtGui
from PyQt4.QtGui import QTabWidget, QHBoxLayout, QWidget, QPushButton
class Model(object):
def __init__(self, view):
self.view = view
class Patient(QWidget):
def __init__(self):
super(Patient, self).__init__()
self.model = Model(self)
self.data = [map(lambda x: {'name': 'ken'}, [x for x in range(10000000)])]
class Tab(QTabWidget):
def __init__(self):
super(Tab, self).__init__()
self.setTabsClosable(True)
self.tabCloseRequested.connect(self.delete)
def add(self):
self.addTab(Patient(), 'name')
def delete(self, index):
patient = self.widget(index)
self.removeTab(index)
import sip
sip.delete(patient)
del patient.model
class Example(QtGui.QWidget):
def __init__(self):
super(Example, self).__init__()
self.initUI()
def initUI(self):
self.hbox = QHBoxLayout()
self.setLayout(self.hbox)
self.tab = Tab()
self.hbox.addWidget(self.tab)
btn = QPushButton()
btn.clicked.connect(self.click)
self.hbox.addWidget(btn)
self.setGeometry(100, 100, 500, 500)
self.setWindowTitle("PyQt")
self.show()
def click(self):
self.tab.add()
def main():
app = QtGui.QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
if __name__ == '__main__':
main()
如果您始终使用Model和Patient类,则可以使用destroyed()
信号在删除窗口小部件时收到通知,并删除模型。
destroyed()
这应该处理所有事情,包括断开与class Patient(QWidget):
def __init__(self):
super(Patient, self).__init__()
self.model = Model(self)
self.data = [map(lambda x: {'name': 'ken'}, [x for x in range(10000000)])]
self.destroyed.connect(self.aboutToBeDeleted)
def aboutToBeDeleted(self):
del self.model
class Tab(QTabWidget):
#...
def delete(self, index):
patient = self.widget(index)
self.removeTab(index)
patient.deleteLater()
相关的所有插槽和信号。调用patient
也应该足够了,而不是使用sip.delete(我相信无论如何都由deleteLater完成)。