第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 MC 體系結構中,相互引用會導致內存泄漏。如何更改一個好的設計程序?

在 MC 體系結構中,相互引用會導致內存泄漏。如何更改一個好的設計程序?

FFIVE 2022-09-06 19:49:09
單擊該按鈕,QTabWidget 將添加一個選項卡(患者對象)。這是我的設計方法。首先,模型請求網絡在獲得數(shù)據后調用患者方法以顯示數(shù)據。其次,患者將積極使用模型中的數(shù)據。所以我定義了self.model = Model ()和self.view = view,但這造成了一個問題?;颊吆湍P拖嗷⒄?,這將導致內存泄漏。因此,當我關閉該選項卡時,我必須刪除patient.model。屬性,以便它們不再相互引用,并且已解決內存泄漏問題。但是,在我的項目中,我有很多視圖和模型相互引用的情況。我需要找到它們,然后在關閉選項卡時關閉它們之間的關系。我認為這種設計在內存泄漏方面有點弱。你能給我一些更好的設計建議嗎?謝謝。import sysfrom PyQt4 import QtGuifrom PyQt4.QtGui import QTabWidget, QHBoxLayout, QWidget, QPushButtonclass Model(object):    def __init__(self, view):        self.view = viewclass 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.modelclass 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()
查看完整描述

1 回答

?
開心每一天1111

TA貢獻1836條經驗 獲得超13個贊

如果始終使用 Model 和 Patient 類,則可以使用銷毀() 信號在移除微件時收到通知,然后刪除模型。


由于還負責斷開與銷毀對象相關的所有插槽,因此無法在自己的實例上調用該方法。為了解決這個問題,使用lambda可以解決這個問題。deleteLater()


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(lambda: self.aboutToBeDeleted())


    def aboutToBeDeleted(self):

        del self.model



class Tab(QTabWidget):

    #...

    def delete(self, index):

        patient = self.widget(index)

        self.removeTab(index)

        patient.deleteLater()

這應該可以處理所有問題,包括斷開與 相關的所有插槽和信號。調用deleteLater()也應該足夠了,而不是使用sip.delete(我相信這無論如何都是由deleteLater完成的)。patient


查看完整回答
反對 回復 2022-09-06
  • 1 回答
  • 0 關注
  • 103 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號