Signal-Slot-Verbindung: kein Aufruf
Verfasst: Mittwoch 15. September 2010, 18:43
Ich weiß, dass allein diese Überschrift schon große Unlust hervorrufen wird, an diesem Thread teilzuhaben.
Ich verzweifle allerdings an einem bestimmten Fall in einem meiner Programme, in dem ich ein Signal erfolgreich mit einem Slot verbunden habe, dieser aber ums Verrecken nicht ausgeführt wird.
Der Aufbau:
Ich habe eine Datenbank, aus der ich mittels einer Klasse „DatenEngine“ Daten auslese, modifiziere, lösche.
Diese werden in einer QGraphicsView dargestellt.
Bei Beendigung des Programms muss das Programm geänderte Daten in die Datenbank schreiben, hierfür benutze ich das Signal „aboutToQuit“.
Der Verbindungsaufruf sieht folgendermaßen aus:
und wird außerhalb einer Klasse direkt vor der Eventloop durchgeführt; „engine“ ist eine Instanz von DatenEngine, „hans“ ist hier eine vereinfachte Test-Methode.
Bei diesem connect-Aufruf bekomme ich keinerlei Fehlermeldung. Bis vor wenigen Stunden hatte ich diesen Aufruf noch im alten Stil gestaltet:
Ich bekam keine Fehlermeldung, der connect-Aufruf gab „True“ zurück.
Wenn ich den Aufruf folgendermaßen durchführte:
was, wie ich seit einigen Stunden weiß, verpönt ist, bekam ich eine Fehlermeldung, deren Ursache ich leider nicht identifizieren konnte:
Klingt, als hätte ich „engine“ irgendwo verloren.
Direkt vor oder nach dem connect-Aufruf kann ich aber ohne Probleme direkt auf „engine.hans()“ zugreifen.
Wenn ich über das Signal einen Slot in einer anderen Klasse, zum Beispiel der QGraphicsScene, ansteuere und in diesem engine.hans() wiederum direkt aufrufe, wird diese Methode ausgeführt. Das wäre also ein Workaround (allerdings natürlich ein für mich völlig inakzeptabler. Das ist schlecht aufgebaut (nicht, dass der Rest meines Programms gut aufgebaut wäre...) und außerdem nur ein Kaschieren, keine Lösung).
Soweit das Technische. Jetzt wird es Esoterisch:
Ich würde auf wenigstens meinen kleinen Finger schwören, dass ich exakt mit diesem Code mein Programm schon erfolgreich wochenlang benutzt habe.
Dass der Aufräum-Code nicht mehr funktioniert, fiel mir nach einer wochenlangen Arbeitspause (damit ist die Arbeit am Programm gemeint; gearbeitet habe ich weiter, allerdings für die Uni...) auf.
Ich bin alles andere als abergläubisch oder sonst in irgendeiner Richtung gläubig; gerade deshalb raubt mir dieses Problem den letzten Nerv. Für mich scheinbar aus dem NICHTS gibt mein Programm den Geist auf.
Ich stand da wie vom Blitz getroffen. Und stehe auch weiterhin so da.
Wäre das ein normaler Entwicklungsprozess-Fehler, würde ich einfach noch weitere 5 Tage suchen und ihn hoffentlich irgendwann finden.
Ich bin allerdings wirklich am Ende meines zugegeben kleinen Python-Lateins; der Fehler ist für Fortgeschrittene wahrscheinlich schnell zu finden.
Ich hoffe, ich habe nichts vergessen, höre jetzt auf zu schreiben und bedanke mich schon mal für wenigstens Anteilnahme an diesem Geisterhaus.
Gruß,
EdgarButan
Ich verzweifle allerdings an einem bestimmten Fall in einem meiner Programme, in dem ich ein Signal erfolgreich mit einem Slot verbunden habe, dieser aber ums Verrecken nicht ausgeführt wird.
Der Aufbau:
Ich habe eine Datenbank, aus der ich mittels einer Klasse „DatenEngine“ Daten auslese, modifiziere, lösche.
Code: Alles auswählen
class DatenEngine(QtCore.QObject):
def hans(self):
print "hans"
Bei Beendigung des Programms muss das Programm geänderte Daten in die Datenbank schreiben, hierfür benutze ich das Signal „aboutToQuit“.
Der Verbindungsaufruf sieht folgendermaßen aus:
Code: Alles auswählen
app = QApplication(sys.argv)
engine = DatenEngine(db)
app.aboutToQuit.connect(engine.hans)
Bei diesem connect-Aufruf bekomme ich keinerlei Fehlermeldung. Bis vor wenigen Stunden hatte ich diesen Aufruf noch im alten Stil gestaltet:
Code: Alles auswählen
QtCore.QObject.connect(app, QtCore.SIGNAL("aboutToQuit()"), engine.hans)
Wenn ich den Aufruf folgendermaßen durchführte:
Code: Alles auswählen
QtCore.QObject.connect(app, QtCore.SIGNAL("aboutToQuit()"), engine, QtCore.SIGNAL("hans()"))
Code: Alles auswählen
Traceback (most recent call last):
File "zellen.py", line 66, in <module>
print QtCore.QObject.connect(app, QtCore.SIGNAL("aboutToQuit()"), engine, QtCore.SLOT("hans()"))
RuntimeError: underlying C/C++ object has been deleted
Direkt vor oder nach dem connect-Aufruf kann ich aber ohne Probleme direkt auf „engine.hans()“ zugreifen.
Wenn ich über das Signal einen Slot in einer anderen Klasse, zum Beispiel der QGraphicsScene, ansteuere und in diesem engine.hans() wiederum direkt aufrufe, wird diese Methode ausgeführt. Das wäre also ein Workaround (allerdings natürlich ein für mich völlig inakzeptabler. Das ist schlecht aufgebaut (nicht, dass der Rest meines Programms gut aufgebaut wäre...) und außerdem nur ein Kaschieren, keine Lösung).
Soweit das Technische. Jetzt wird es Esoterisch:
Ich würde auf wenigstens meinen kleinen Finger schwören, dass ich exakt mit diesem Code mein Programm schon erfolgreich wochenlang benutzt habe.
Dass der Aufräum-Code nicht mehr funktioniert, fiel mir nach einer wochenlangen Arbeitspause (damit ist die Arbeit am Programm gemeint; gearbeitet habe ich weiter, allerdings für die Uni...) auf.
Ich bin alles andere als abergläubisch oder sonst in irgendeiner Richtung gläubig; gerade deshalb raubt mir dieses Problem den letzten Nerv. Für mich scheinbar aus dem NICHTS gibt mein Programm den Geist auf.
Ich stand da wie vom Blitz getroffen. Und stehe auch weiterhin so da.
Wäre das ein normaler Entwicklungsprozess-Fehler, würde ich einfach noch weitere 5 Tage suchen und ihn hoffentlich irgendwann finden.
Ich bin allerdings wirklich am Ende meines zugegeben kleinen Python-Lateins; der Fehler ist für Fortgeschrittene wahrscheinlich schnell zu finden.
Ich hoffe, ich habe nichts vergessen, höre jetzt auf zu schreiben und bedanke mich schon mal für wenigstens Anteilnahme an diesem Geisterhaus.
Gruß,
EdgarButan