PyQt4: modales Dialogfenster schließt auch das Hauptprogramm

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 bin von PyQt3 auf PyQt4 umgestiegen.
Nun habe ich das Problem, dass ich es einfach nicht mehr schaffe, einen Dialog, der von einem
MainWindow aus aufgerufen wird, vernünftig zu handhaben.

Hier mal ein Beispiel:

Der Dialog wird in der Datei "Ui_maindlg.py" definiert:

Code: Alles auswählen

from PyQt4 import QtCore, QtGui

class Ui_MeinDialog(object):
    def setupUi(self, MeinDialog):
        MeinDialog.setObjectName("MeinDialog")
        MeinDialog.setWindowModality(QtCore.Qt.WindowModal)
        MeinDialog.resize(QtCore.QSize(QtCore.QRect(0,0,400,300).size()).expandedTo(MeinDialog.minimumSizeHint()))
        MeinDialog.setModal(True)

        self.pushButton = QtGui.QPushButton(MeinDialog)
        self.pushButton.setGeometry(QtCore.QRect(30,250,78,27))
        self.pushButton.setObjectName("pushButton")

        self.pushButton_2 = QtGui.QPushButton(MeinDialog)
        self.pushButton_2.setGeometry(QtCore.QRect(290,250,78,27))
        self.pushButton_2.setObjectName("pushButton_2")

        self.retranslateUi(MeinDialog)
        QtCore.QObject.connect(self.pushButton,QtCore.SIGNAL("clicked()"), self.on_pushButton_clicked)
        QtCore.QObject.connect(self.pushButton_2,QtCore.SIGNAL("clicked()"),self.on_pushButton_2_clicked)
        QtCore.QObject.connect(self,QtCore.SIGNAL("accepted()"),self.accept)
        QtCore.QObject.connect(self,QtCore.SIGNAL("rejected()"),self.reject)
        QtCore.QMetaObject.connectSlotsByName(MeinDialog)

    def retranslateUi(self, MeinDialog):
        MeinDialog.setWindowTitle(QtGui.QApplication.translate("MeinDialog", "Dialog", None, QtGui.QApplication.UnicodeUTF8))
        self.pushButton.setText(QtGui.QApplication.translate("MeinDialog", "JAWOLL", None, QtGui.QApplication.UnicodeUTF8))
        self.pushButton_2.setText(QtGui.QApplication.translate("MeinDialog", "NÖÖÖ", None, QtGui.QApplication.UnicodeUTF8))

Die Funktionalität der beiden Push-Buttons implementiere ich in der Datei "meindlg_impl.py":

Code: Alles auswählen

from PyQt4.QtGui import QDialog
from PyQt4.QtCore import pyqtSignature

from Ui_meindlg import Ui_MeinDialog

class MeinDialog_Impl(QDialog, Ui_MeinDialog):
    """
    Class documentation goes here.
    """
    def __init__(self, parent = None):
        """
        Constructor
        """
        QDialog.__init__(self, parent)
        self.setupUi(self)
    
    @pyqtSignature("")
    def on_pushButton_clicked(self):
        """
        Slot documentation goes here.
        """
        print "JA GEWÄHLT!"
        self.accept()
    
    @pyqtSignature("")
    def on_pushButton_2_clicked(self):
        """
        Slot documentation goes here.
        """
        print "NEIN GEWÄHLT!"
        self.reject()

In meinem Hauptfenster wird der Dialog über die Funktion (isr an ein Click-ereignis e. Push-Buttons gebunden):

Code: Alles auswählen

def on_pushButton_clicked(self):
        """
        Slot documentation goes here.
        """
        self.frmMyDialog = QtGui.QDialog()
        self.ui = MeinDialog_Impl()
        self.ui.setupUi(self.frmMyDialog)
        if self.frmMyDialog.exec_() == QtGui.QDialog.Accepted:
            print "DAS WARS"
aufgerufen.

Wenn ich nun im Dialog auf "JAWOLL" oder "NÖÖÖ" klicke, wird auf der Konsole auch schön "JA GEWÄHLT!" bzw. "NEIN GEWÄHLT!" ausgegeben. Der Text "DAS WARS" erscheint jedoch nicht und der Dialog verschwindet (soll ja auch so sein), aber leider auch das Hauptfenster... die Anwendung wird beendet.

Wenn ich nun in "Ui_maindlg.py" die Zeilen

Code: Alles auswählen

QtCore.QObject.connect(self,QtCore.SIGNAL("accepted()"),self.accept)
QtCore.QObject.connect(self,QtCore.SIGNAL("rejected()"),self.reject)
weg lasse, dann erscheinen auch wieder die Meldungen, der Dialog wird jedoch nicht geschlossen und ich kann ihn nur durch Klick auf das "Fenster-X" verschwinden lassen. Dann jedoch fehlt auch hier wieder die Meldung "DAS WARS".

Ich bin nun schon ganz verzweifelt... :cry: in PyQt klappte die letztere Variante (ein accept() bzw. reject() ganz am Ende der Funktion führte dazu, dass der Dialog geschlossen wurde und Accepted bzw. Rejected schön an die aufrufende Funktion durchgereicht wurde.

Wo liegt mein Denkfehler? Was kann ich tun? Ich habe nun schon wie ein Irrer in der Qt4- und PyQt4-Dokumentation rumgewühlt und finde keine Antwort. Auch im Netz bin ich nicht fündig geworden.

Ein Thread hier im Forum ließ mich zwar hoffen ( setQuitOnLastWindowClosed( False) ), brachte aber auch keine Veränderung der Funktionalität.

Hoffentlich kann mir jemand helfen, sonst muss ich wieder auf PyQt3 zurück... meine Frau braucht dringend das Programm, das ich an Qt4 anpassen wollte.

Vielen Dank und Gruß aus Berlin

Daniel
Antworten