2013-07-29 17 views
8

हटा दिया गया है लिपटे अगर मैं इस कोड को चलाएँ:PyQt: RuntimeError: C/C++ वस्तु

#!/usr/local/bin/ python3 

import sys 
from PyQt4.QtCore import * 
from PyQt4.QtGui import * 


class Window(QMainWindow): 

    def __init__(self): 
     super().__init__() 
     self.button1 = QPushButton("1") 
     self.button2 = QPushButton("2") 
     self.setCentralWidget(self.button1) 
     self.button1.clicked.connect(lambda: self.setCentralWidget(self.button2)) 
     self.button2.clicked.connect(lambda: self.setCentralWidget(self.button1)) 
     self.show() 

if __name__ == '__main__': 

    import sys 
    app = QApplication(sys.argv) 
    window = Window() 
    sys.exit(app.exec_()) 

... मैं इस उत्पादन प्राप्त करें:

Traceback (most recent call last): 
    File "test.py", line 16, in <lambda> 
    self.button2.clicked.connect(lambda: self.setCentralWidget(self.button1)) 
RuntimeError: wrapped C/C++ object of type QPushButton has been deleted 

मुझे समझ नहीं आता क्यों वस्तु हटा दिया जा रहा है। खिड़की को इसका संदर्भ बनाए रखना चाहिए। मैं अच्छी तरह से इन पदों की जांच की है: Understanding the “underlying C/C++ object has been deleted” error Can a PyQt4 QObject be queried to determine if the underlying C++ instance has been destroyed?

क्यों बटन हटाया जा रहा है?

+1

मुझे QWidget के उप-वर्ग के साथ एक ही समस्या हो रही थी, और यह पता चला कि समस्या यह थी कि मैं अपने '__init__' की शुरुआत में QWidget की' __init__' को कॉल करना भूल गया था। मक्कार। – spookypeanut

उत्तर

9

इस सवाल का इस उत्तर यहाँ पाया जाता है के रूप में: Python PySide (Internal c++ Object Already Deleted)

जाहिर है, एक विजेट बताए setCentralWidget का उपयोग कर QMainWindow के लिए और फिर setCentralWidget के साथ एक और विजेट बताए अंतर्निहित C++ QWidget कारण होगा हटाए जाने के लिए, भले ही मेरे पास है एक वस्तु जो इसके संदर्भ में रखती है।

Note: QMainWindow takes ownership of the widget pointer and deletes it at the appropriate time.

0

मस्तिष्क का जवाब पूरी तरह से समस्या को समझाता है। This Link चीजों को और विस्तार से समझाएं।

इस समस्या का मेरा समाधान विजेट के ऑब्जेक्ट्स के गुणों के रूप में सेट करना था (उदाहरण के लिए self.label = ... का उपयोग करके अपनी कक्षा विधियों में label = ...)। आप विजेट से जुड़े किसी लेआउट के लिए भी ऐसा करना चाहेंगे।

इस तरह आप विजेट की एक प्रति बनाते हैं ताकि जब C++ मेमोरी क्लीनअप होता है, तब भी आपके पास विजेट का संदर्भ है।

उम्मीद है कि इससे मदद मिलती है।