PyQt4, Modale Dialoge, Windows

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
ForestFunk
User
Beiträge: 5
Registriert: Donnerstag 29. September 2011, 12:47

Hi zusammen,

ein frohes neues Jahr wünsche ich erstmal.

Aber jetzt doch zu meinem Problem damit modale Dialoge in Windows aufzurufen. Unter Linux funktionierte es bisher wunderbar, nur der erste Windows Feldversuch brach Ernüchterung. :-)


Meine Konfiguration

Windows 7, SP1
Qt 4.7.4 und 4.8.0
PyQt 4.8.x und 4.9.1
Python 2.7.2

Ich habe euch ein Beispielprojekt angehängt. http://ul.to/5v588u3z (hab die forumseigene Dateiupload-Funktion nicht gefunden, daher uploaded ;-))

Bei einem Klick auf "Open Modal" sollte mir ein modal-Dialog geöffnet werden. Beim Klick auf "Open Modeless" entsprechend ein modeless-Dialog. Um der Doku treu zu bleiben, hab ich die gleiche Logik (für den modal-Dialog) in den Konstruktor des MainWindows gesetzt und dort startet der Dialog ohne Probleme.

Hat jemand von euch ne Idee?


Grüße,

forest


PS: Folgende Debug Meldung kriege ich, wenns abschmiert

Code: Alles auswählen

Debug-Meldung

Problemsignatur:
  Problemereignisname:	APPCRASH
  Anwendungsname:	python.exe
  Anwendungsversion:	0.0.0.0
  Anwendungszeitstempel:	4df4ba7c
  Fehlermodulname:	QtGui4.dll
  Fehlermodulversion:	4.8.0.0
  Fehlermodulzeitstempel:	4ee5999c
  Ausnahmecode:	c0000005
  Ausnahmeoffset:	000086be
  Betriebsystemversion:	6.1.7601.2.1.0.256.1
  Gebietsschema-ID:	1031
  Zusatzinformation 1:	0a9e
  Zusatzinformation 2:	0a9e372d3b4ad19135b953a78882e789
  Zusatzinformation 3:	0a9e
  Zusatzinformation 4:	0a9e372d3b4ad19135b953a78882e789
lunar

@ForestFunk: Lade den Quelltext bitte auf http://paste.pocoo.org, GitHub oder einer vergleichbaren Seite hoch, so dass man ihn ansehen kann, ohne erst ein Archiv herunterladen zu müssen.
ForestFunk
User
Beiträge: 5
Registriert: Donnerstag 29. September 2011, 12:47

Aber klar doch. War auch mein erster Gedanke, aber dachte gerade DAS wäre zu stressig für euch. ;-)

main.py => http://paste.pocoo.org/show/528765/
mainwindow.py => http://paste.pocoo.org/show/528766/
mainwindow.ui => http://paste.pocoo.org/show/528768/
lunar

@ForestFunk: Ohne das jetzt ausprobiert zu haben, würde ich darauf tippen, dass Du Opfer eines Konflikts zwischen der Speicherverwaltung von Qt und dem GC von Python geworden bist, und eines der Dialog-Objekte zu früh gelöscht wird. Versuche einmal, den Dialogen "self" als "parent" zu übergeben.

Verwende keine Sterchen-Importe, sondern importiere explizit nur die Klassen, die Du wirklich benötigst.

"QObject.connect( app, SIGNAL( 'lastWindowClosed()' ), app, SLOT( 'quit()' ) )" ist überflüssig, denn Qt beendet die Anwendung ohnehin schon automatisch, wenn das letzte Fenster geschlossen wird. Bei Signal-Slot-Verbindungen ist es empfehlenswert, die neue Syntax zu verwenden, so wie Du das in "mainwindow.py" bereits getan hast.

Verwende "loadUi()" statt "loadUiType()".

"__del__" in "mainwindow.py", 29ff. ist ebenso überflüssig wie falsch. Python hat einen Garbage-Collector, es ist mithin nicht erforderlich, Attribute selbst zu "löschen" (falls Du das mit "self.ui = None" bezweckt hast). Der Aufruf von "__del__" ist ohnehin nicht garantiert.

Nebenbei: Möchtest Du Deinen Quelltext von anderen begutachten lassen, ist es empfehlenswert, sich an die Stilvorgaben aus PEP 8 zu halten, im Bezug auf die Namensgebung und die Verwendung von Leerzeichen. Leerzeichen um Klammern ist in Python eher ungewöhnlich.

Edit: Zur Namensgebung: Vermeide Typpräfixe wie "dlg" oder "pbu", sondern verwende Namen, die die Funktion des Objekts beschreiben. Die Typpräfixe bringen keinen Mehrwert, und sind im Zweifelsfall nur irreführend, wenn Du nämlich vergisst, sie zu aktualisieren, wenn Du den Typ des Objekts änderst.

Den Titel eines "QMainWindow" kannst Du auch im Designer festlegen.

Der Aufruf von ".show()" in "MainWindow.__init__()" ist überflüssig, da Du ".show()" in "main.py" ohnehin aufrufst. Die Initialisierung eines Objekts sollte auch keine sichtbaren Seiteneffekte wie das Anzeigen eines Fensters haben.

Ich habe mir erlaubt, "mainwindow.py" und "mainwindow.ui" dahingehend zu korrigieren. "main.py" habe ich der Einfachheit halber in "mainwindow.py" verschoben. Ich glaube, dass diese Änderungen Dein Problem beheben sollten.
ForestFunk
User
Beiträge: 5
Registriert: Donnerstag 29. September 2011, 12:47

lunar hat geschrieben:@ForestFunk: Ohne das jetzt ausprobiert zu haben, würde ich darauf tippen, dass Du Opfer eines Konflikts zwischen der Speicherverwaltung von Qt und dem GC von Python geworden bist, und eines der Dialog-Objekte zu früh gelöscht wird. Versuche einmal, den Dialogen "self" als "parent" zu übergeben.
Bereits probiert. Wenn ich self als Parent übergebe, hat das den gleichen Effekt.

Habe auch schon den Umweg über das modal- und windowModality-Property und ein Aufruf über die show-Methode versucht.

Das witzige ist ja, unter Ubuntu 11.10 läuft der Code fehlerfrei. Nur unter Windows 7 nicht mehr. :-)

lunar hat geschrieben:"QObject.connect( app, SIGNAL( 'lastWindowClosed()' ), app, SLOT( 'quit()' ) )" ist überflüssig, denn Qt beendet die Anwendung ohnehin schon automatisch, wenn das letzte Fenster geschlossen wird. Bei Signal-Slot-Verbindungen ist es empfehlenswert, die neue Syntax zu verwenden, so wie Du das in "mainwindow.py" bereits getan hast.

Verwende "loadUi()" statt "loadUiType()".

"__del__" in "mainwindow.py", 29ff. ist ebenso überflüssig wie falsch. Python hat einen Garbage-Collector, es ist mithin nicht erforderlich, Attribute selbst zu "löschen" (falls Du das mit "self.ui = None" bezweckt hast). Der Aufruf von "__del__" ist ohnehin nicht garantiert.
Das sind alles Relikte aus der MonkeyStudio IDE (Projekt-Template), aber vielen Dank für den Hinweis, werde ich zukünftig beachten. :-)
lunar

@ForestFunk: Welche PyQt-Version verwendest Du? Im ersten Beitrag nennst Du verschiedene Versionen...
ForestFunk
User
Beiträge: 5
Registriert: Donnerstag 29. September 2011, 12:47

hey lunar,

ich verwendete Version 4.8.0. Jetzt hast du mich auf den entscheidenden Tipp gebracht... ich hatte zwar testweise Qt aktualisiert, nicht aber PyQt. (Dachte ich zwar, war aber nicht so :D )

Mit Version 4.9.0 (32 Bit) funktioniert es natürlich einwandfrei.

Wenn du wüsstest, wieviel Zeit ich da reingesteckt habe..................


Vielen Dank für deine Hilfe.
Antworten