2013-07-29 7 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 하나의 위젯을 할당 한 후 기본 C++는 QWidget의 원인이됩니다 setCentralWidget 또 다른 위젯을 할당 삭제 될, 내가 가진 비록 참조를 유지하는 객체

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

0

브레인의 대답은 문제를 완벽하게 설명합니다. This Link 더 자세히 설명합니다.

이 문제의 해결책은 위젯을 객체의 속성으로 설정하는 것입니다 (예 : 클래스 메서드에서 label = ... 대신 self.label = ...). 위젯에 첨부 된 모든 레이아웃에 대해 동일한 작업을 수행하고자 할 수 있습니다.

이렇게하면 C++ 메모리 정리가 발생할 때 위젯에 대한 참조가 남아 있도록 위젯 복사본을 만들 수 있습니다.

희망이 도움이됩니다.