PyQt4 verschachtelte Klassen – "RuntimeError: zugrunde liegendes C / C ++ – Objekt wurde gelöscht"

Ich versuche, eine coole app zu bauen, aber es scheint mir fehlt etwas Wissen. Lesen Sie viele Infos und Beispiele im Internet, aber es hilft nicht: Verständnis der "zugrunde liegenden C / C ++ – Objekt wurde gelöscht" Fehler


Ok, hier was ich mache:

Ich schaffe ein zentrales Widget von meinem main.py , das geht gut und ich gebe es nicht hier vollständig:

self.rw = ReportWidget() self.setCentralWidget(self.rw) 

Und hier ist mein zentrales widget – report.py :

 #! /usr/bin/env python # -*- coding: utf-8 -*- from PyQt4 import QtGui, QtCore class ReportWidget(QtGui.QWidget): def __init__(self, parent=None): super(ReportWidget, self).__init__(parent) self.setup_ui() def setup_ui(self): report = QtGui.QVBoxLayout(self) report.setAlignment(QtCore.Qt.AlignTop) head = QtGui.QHBoxLayout() add_label = QtGui.QLabel(u"Add") head.addWidget(add_label) report.addLayout(head) area = QtGui.QScrollArea() area.setWidgetResizable(True) area.setEnabled(True) layout = QtGui.QVBoxLayout() layout.setAlignment(QtCore.Qt.AlignTop) widget = QtGui.QWidget() widget.setLayout(layout) area.setWidget(widget) report.addWidget(area) self.s = layout # trying to create first line: first_line = Line(self) self.s.addWidget(first_line) first_line.set_controls(True, False) head = QtGui.QHBoxLayout() ok = QtGui.QPushButton(u"Calculate") head.addWidget(ok) report.addLayout(head) 

Fortsetzung von der gleichen Datei report.py :

 class Line(QtGui.QWidget): def __init__(self, parent=None): super(Line, self).__init__(parent) self.setup_ui(parent) def setup_ui(self, parent): add_button = QtGui.QPushButton() add_button.setObjectName("add_button") self.add_button = add_button self.layout = QtGui.QHBoxLayout(line) self.layout.addWidget(add_button) def set_controls(self, add_button=True, remove_button=True): self.add_button.setEnabled(add_button) 

So läuft main.py RuntimeError: underlying C/C++ object has been deleted beim letzten Code-Code RuntimeError: underlying C/C++ object has been deleted wo ich versuche, den setEnabled Parameter auf den neuen Button zu setzen, als ob er niemals irgendwo erstellt oder gebunden wurde.

Es scheint, ich habe einige Design-Fehler. Vielleicht ist es falsch, andere Klassen in einer Datei zu haben oder? Oder vielleicht beherrsche ich nicht ganz, welches Widget welches Elternteil hat und wie Layouts funktionieren.


Vielen Dank für das Lesen. Einen schönen Tag noch!

  • PYQT und Fortschrittsbalken während des langen Prozesses
  • Pyqt dynamische erzeugen QMenu-Aktion und verbinden
  • Konvertieren Sie QPixmap zu Numpy
  • Warum muss QApplication.processEvents () aufgerufen werden, bis QNetworkRequest bei der Verwendung von QWebView beendet ist?
  • Ziehen / Verschieben eines QPushButton in PyQt
  • Löschen Sie alle Widgets in einem Layout in pyqt
  • 2 Solutions collect form web for “PyQt4 verschachtelte Klassen – "RuntimeError: zugrunde liegendes C / C ++ – Objekt wurde gelöscht"”

    Danke an alle, die versuchten zu antworten! Leider hat niemand gesagt, was für eine Menge Mist ich schrieb! *Lächeln*

    Meine line ist schon ein Widget und ich brauche mich nicht selbst zu schaffen. Alles was ich tun musste, ist, Layout in setup_ui zu erstellen und Widgets hinzuzufügen. Schließlich sieht es so aus:

     class Line(QtGui.QWidget): def __init__(self, parent=None): super(Line, self).__init__(parent) self.setup_ui(parent) def setup_ui(self, parent): line = QtGui.QHBoxLayout(self) add_button = QtGui.QPushButton() add_button.setObjectName("add_button") line.addWidget(add_button) # to get reference from outside self.add_button = add_button def set_controls(self, add_button=True, remove_button=True): self.add_button.setEnabled(add_button) 

    Besonderer Dank an Nymk und Avaris !

    Ich konnte einen Fehler nicht mit dem Code reproduzieren, den du uns gezeigt hast (abgesehen von einem Fehler über die Variable line nicht in Line.setup_ui definiert Line.setup_ui ). Wenn ich die line mit dem self ersetzte, bekam ich keinen Fehler.

    Allerdings konnte ich einen Crash bekommen, wenn ich mich an einen QWidget , den ich erstellt habe und habe keinen Hinweis darauf. Mit anderen Worten, fügte ich hinzu

      line = QtGui.QWidget() 

    Zu Line.setup_ui , und festgestellt, dass dies auf der gleichen Zeile des Codes, die Sie berichtet stürzte, beschwert, dass das eingewickelte C / C ++ – Objekt gelöscht wurde.

    Python ist die beste Programmiersprache der Welt.