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"
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)
Ich bin nun schon ganz verzweifelt... 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