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

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

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

Beitragvon PepeCyB » Montag 19. Februar 2007, 18:15

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

Beitragvon PepeCyB » Montag 19. Februar 2007, 21:05

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

Gelöst: Dialogfenster in PyQt modal ausführen

Beitragvon PepeCyB » Montag 19. Februar 2007, 21:56

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

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

Beitragvon lunar » Dienstag 20. Februar 2007, 15:36

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:

Beitragvon mkesper » Dienstag 20. Februar 2007, 20:33

Jedes modale Fenster gibt meiner Meinung nach 1000 Strafpunkte. Oh, wie ich sie hasse! :(
lunar

Beitragvon lunar » Dienstag 20. Februar 2007, 22:39

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

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder