Seite 1 von 1

[gelöst]Dialogfenster in PyQt modal ausführen

Verfasst: Montag 19. Februar 2007, 18:15
von PepeCyB
Hallo,

ich bastele gerade an einem kleinen "Minimal-HTML-Editor" für die
Erstellung von Produktbeschreibungen bei eBay.

Nun möchte ich z. B. eine unsortierte Liste einfügen. Dies soll
in einem eigenen Dialogfenster erfolgen, welches mittels einer QSpinBox
die Anzahl der Listenelemente ermittelt und in einer QTable mit nur
einer Spalte die Listeneinträge erfaßt.
Das Dialogfenster soll, durch ein Signal veranlaßt, modal angezeigt
werden und nach Klick auf einen "Einfügen"-Button geschlossen werden.
Da das Anwendungsfenster und das Dialogfenster in zwei unterschiedlichen
Python-Modulen definiert werden, habe ich mich wohl oder übel dazu ent-
schlossen, die Übergabe der Listenelemente über eine globale (ja... ich
weiß... ist nicht schön... hab aber keine andere Lösung gefunden) Liste
zu bewerkstelligen. Das klappt auch ganz gut, jdeoch besteht die
Schweirigkeit, die Liste im Ablauf des "Hauptfensters" auszuwerten.

Hier nun mein Problem:

Das "Hauptfenster" wird in der Datei mainform_impl.py gehandhabt.
Hier wird die Slot-Funktion slList(self) definiert.
Zu Testzwecken habe ich hier die Zeile

print globals.globlist

angefügt, um zu überprüfen, ob die Liste wirklich in die globale Variable
übernommen wurde. Das ist auch so, aber leider wird die Zeile mit der
print-Anweisung bereits ausgeführt, bevor noch das Dialogfenster
mit besagten "Einfügen"-Button geschlossen wird. Es erscheint also
als Konsolenausgabe lediglich die als leere Liste zuvor initialisierte
Liste []. Ein erneuter Aufruf von slList(self) erzeugt dann aber
die Ausgabe der zuvor erstellten Liste. Die neu eingegebe Liste
wird wiederum in globals.globlist übernommen. aber natürlich wieder
nicht mit der print-Anweisung ausgegeben.

Frage:

Wie sorge ich dafür, daß der Programmablauf während der Ausführung des
Listendialoges quasi "angehalten" wird, bis das Dialogfenster mit
dem "Einfügen"-Buttons geschlossen wurde?
Zur Zeit "läuft" ja die Funktion slList(self) nach

self.liform.show()

quasi "weiter" und sorgt in der Zeile

print globals.globlist

für besagte nicht aktuelle Ausgabe. Somit könnte ich auch an dieser
Stelle nicht die Auswertung der Liste - also das Einfügen derselben
im QText-Widget des Hauptfensters - erledigen.

Hoffentlich konnte ich mich verständlich machen... und hoffentlich
kann mir jemand einen Tip geben.... meine Frau benötigt das "Progrämmle"
dringend...

Gruß
Daniel


Code: Alles auswählen

    def slList(self):
        self.liform=ulForm_Impl()
        self.liform.show()                       #hier soll quasi gewartet werde, bis der Dialog geschlossen wurde
        print globals.globliste

Verfasst: Montag 19. Februar 2007, 21:05
von PepeCyB
Hallo,

als Ergänzung:

Ich habe diese Anfrage auch im qtforum.de gestellt und als Antwort
servus, müsste dir weiter helfen Smile

if( self.liform.exec() == QDialog::Accepted ) {
print globals.globliste
}


Ist im C++ Syntax, müsste auch in Python gehen.
_________________
ChMaster
erhalten.
Hab das ganze auch rasch umgesetzt, jedoch kollidiert die Funktion exec() mit der
Python-Anweisung "exec(file)".
Wie kann ich das noch zurechtbiegen???

Code: Alles auswählen

    def slList(self):
        self.liform=ulForm_Impl()
        if self.liform.exec() == QDialog.Accepted(): # <- hier wird ein Syntax-Fehler erzeugt,
        print globals.globliste                                    # da der Aufruf mit "Python.exec" kollidiert
Gruß Daniel

Gelöst: Dialogfenster in PyQt modal ausführen

Verfasst: Montag 19. Februar 2007, 21:56
von PepeCyB
Der Tip aus dem qtforum.de hat mir die Lösung gebracht.

Nach Studium der PyQT-Referenz bin ich darauf gestoßen, daß die
Member-Funktion exec() in QDialog aus besagtem Grund (Konflikt
mit der Python-internen exec-Anweisung) in exec_loop() umbenannt
wurde.
Tja... da hatte ich doch nicht alle Informationsquellen ausgeschöpft :K
und durchgelesen... ich gelobe Besserung.

Der Code

Code: Alles auswählen

    def slList(self):
        self.liform=ulForm_Impl()
        if self.liform.exec_loop() == QDialog.Accepted:
            print globals.globliste
funktioniert nun wie gewünscht.

Gruß
Daniel

Re: Gelöst: Dialogfenster in PyQt modal ausführen

Verfasst: Dienstag 20. Februar 2007, 15:36
von lunar
PepeCyB hat geschrieben:Der Tip aus dem qtforum.de hat mir die Lösung gebracht.

Nach Studium der PyQT-Referenz bin ich darauf gestoßen, daß die
Member-Funktion exec() in QDialog aus besagtem Grund (Konflikt
mit der Python-internen exec-Anweisung) in exec_loop() umbenannt
wurde.
Tja... da hatte ich doch nicht alle Informationsquellen ausgeschöpft :K
und durchgelesen... ich gelobe Besserung.
Sag mal, hast du dir den überhaupt die Dokumentation von QT und PyQT durchgelesen? Da steht das nämlich alles drinnen : roll:

http://doc.trolltech.com/3.3/qdialog.html#modal
http://www.riverbankcomputing.com/Docs/ ... ml#AEN1086

Verfasst: Dienstag 20. Februar 2007, 20:33
von mkesper
Jedes modale Fenster gibt meiner Meinung nach 1000 Strafpunkte. Oh, wie ich sie hasse! :(

Verfasst: Dienstag 20. Februar 2007, 22:39
von lunar
mkallas hat geschrieben:Jedes modale Fenster gibt meiner Meinung nach 1000 Strafpunkte. Oh, wie ich sie hasse! :(
Full ack! Wenn meine Internetverbindung zusammen bricht (kommt hier auf dem Land öfter mal vor) während KMail nach neuen Mails schaut, dann regnest Fenster ;) Vier Konten => vier modale Fehlermeldungen samt dazugehörigen 'Bing' :x