在MC体系结构中,相互引用会导致内存泄漏。如何更改好的设计程序?

问题描述 投票:0回答:1

单击按钮,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()
python pyqt pyqt4
1个回答
0
投票

如果您始终使用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完成)。

© www.soinside.com 2019 - 2024. All rights reserved.