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

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
PepeCyB
User
Beiträge: 14
Registriert: Dienstag 3. Januar 2006, 18:47
Wohnort: Berlin
Kontaktdaten:

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
Zuletzt geändert von PepeCyB am Dienstag 20. Februar 2007, 14:23, insgesamt 1-mal geändert.
PepeCyB
User
Beiträge: 14
Registriert: Dienstag 3. Januar 2006, 18:47
Wohnort: Berlin
Kontaktdaten:

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
PepeCyB
User
Beiträge: 14
Registriert: Dienstag 3. Januar 2006, 18:47
Wohnort: Berlin
Kontaktdaten:

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
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
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

Jedes modale Fenster gibt meiner Meinung nach 1000 Strafpunkte. Oh, wie ich sie hasse! :(
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
Antworten