PyQt: Absturz mit Laufzeitfehler: eingewickelt C/C++ - Objekt wurde gelöscht
Wenn ich diesen code ausführen:
#!/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_())
...Bekomme ich diese Ausgabe:
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
Verstehe ich nicht, warum das Objekt gelöscht wird. Fenster sollten weiterhin einen Verweis darauf.
Ich habe Sie gründlich untersucht, diese Beiträge:
Das Verständnis der "zugrunde liegenden C - /C++ - Objekt wurde gelöscht" - Fehler
Kann ein PyQt4 QObject abgefragt werden, um zu bestimmen, wenn die zugrunde liegende C++ - Instanz zerstört wurde?
Warum ist der button gelöscht wird?
Ich hatte ein ähnliches problem mit eine Unterklasse von QWidget, und es stellte sich heraus, das problem war, dass ich vergessen hatte, zu rufen, QWidget ' s
__init__
zu Beginn meiner __init__
. Tricksy.InformationsquelleAutor Brian | 2013-07-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
Diese Antwort auf diese Frage finden Sie hier:
Python-PySide (Interne c++ - Objekt wurde Bereits Gelöscht)
Offenbar Zuordnung eines widgets zu QMainWindow mit setCentralWidget und dann die Zuweisung ein weiteres widget mit setCentralWidget wird die Ursache der zugrunde liegenden c++ - QWidget gelöscht werden, auch wenn ich ein Objekt, das verwaltet Referenz.
InformationsquelleAutor Brian
Gehirns Antwort erklärt das problem perfekt. Dieser Link Dinge erklären, im detail.
Meine Lösung für dieses problem war, die widgets als Attribute des Objekts (z.B. einfach mit
self.label = ...
stattlabel = ...
in Ihrer Klasse Methoden). Vielleicht möchten das gleiche zu tun für alle layouts mit dem widget verknüpft.Diese Weise erstellen Sie eine Kopie des widgets, so dass, wenn C++ Speicher-Bereinigung stattfindet, haben Sie immer noch eine Referenz auf das widget.
Hoffe, das hilft.
InformationsquelleAutor Ankit Bindal