PyQt: RuntimeError: l'objet C / C ++ encapsulé a été supprimé
Si j'exécute ce code:
#!/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_())
...J'obtiens ce résultat:
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
Je ne comprends pas pourquoi l'objet est supprimé. La fenêtre doit conserver une référence à elle.
J'ai soigneusement étudié ces postes:
La compréhension de la “sous-jacente C/C++ objet a été supprimé” erreur
Peut un PyQt4 QObject être interrogé pour déterminer si le sous-jacent C++ instance a été détruit?
Pourquoi le bouton supprimé?
source d'informationauteur Brian
Vous devez vous connecter pour publier un commentaire.
Cette réponse à cette question est disponible ici:
Python PySide (Interne du c++ Objet Déjà Supprimé)
Apparemment, l'attribution d'un widget de QMainWindow à l'aide de setCentralWidget et en l'affectant à un autre widget avec setCentralWidget sera la cause de la sous-jacentes c++ QWidget à être supprimé, même si j'ai un objet qui maintient référence.
Du cerveau réponse explique le problème à la perfection. Ce Lien expliquer les choses plus en détail.
Ma solution à ce problème était de mettre les widgets comme les attributs de l'objet (par exemple, en utilisant simplement
self.label = ...
au lieu delabel = ...
dans vos méthodes de la classe). Vous voulez peut-être faire de même pour toutes les mises en page jointe au widget.Cette manière, vous créez une copie de la fenêtre, de sorte que lorsque C++ de nettoyage de la mémoire se produit, vous avez toujours une référence pour le widget.
Espère que cette aide.