Seite 1 von 1

PyQT QDialog wird versteckt aber nicht beenden

Verfasst: Mittwoch 18. August 2010, 22:51
von Xinor
Hi,

mit QDialog habe ich ein kleines Problem. Ich habe ein OK- und ein Cancel-Knopf. Wenn ich auf OK drücke, möchte ich dass das mir z.B. ein Liste mir Elementen zurückgegeben wird und wenn ich auf Cancel drücke, eine leere Liste. Das funktioniert auch soweit. Aber das QDialog wird leider nur versteckt, nicht beendet. Aus der Doku werde ich leider auch nicht schlau. Sys.exit() beendet es zwar, aber man bekommt nichts mehr zurück. Deletelater hilft leider auch nicht. Also wie kann ich es hinbekommen, dass mir das Widget noch etwas zurückgibt und dennoch komplett beende wird. Das Widget soll auch mit exec_ aufgerufen werden. Wäre nett, wenn mir jemand erklären könnte was ich falsch mache.
Hier der Code:

Code: Alles auswählen

class MyClass(QDialog):
    def __init__(self, x, y, parent=None):
        QWidget.__init__(self, parent)


    def cancel(self):
        self.close()

    def addDingsda(self):
        self.accept()
        
    def exec_(self):
        if QDialog.exec_(self) == QDialog.Accepted:
            return  self.dingsdaListe
        else:
            return []
            
def test():
    app = QApplication([""])
    form = MyClass(x, y)
    i = form.exec_()
    sys.exit(app.exec_())

if __name__ == "__main__":
    test()

Re: PyQT QDialog wird versteckt aber nicht beenden

Verfasst: Donnerstag 19. August 2010, 07:44
von BlackJack
@Xinor: Der Quelltext da ist nicht lauffähig. Abgesehen von den fehlenden Importen fällt sofort ins Auge, dass es `self.dingsdaListe` nicht gibt. Es macht nicht viel Sinn anhand von einem Quelltext zu raten was denn am *tatsächlichen* Quelltext das Problem ist.

Re: PyQT QDialog wird versteckt aber nicht beenden

Verfasst: Donnerstag 19. August 2010, 08:47
von lunar
@Xinor: Das kann so gar nicht funktionieren. Du kannst nicht einfach beliebig wichtige Methoden des Dialogs (e.g. ".exec_()") neu implementieren, und dann hoffen, dass es funktioniert. Du darfst "_exec()" nicht überschreiben. Wenn Du eine Methode möchtest, die einen Dialog anzeigt, auf Eingabe wartet, und anschließend das Ergebnis zurück gibt, musst Du diese selbst schreiben:

Code: Alles auswählen

class MyDialog(QDialog):
    # ...
    @classmethod
    def askUser(cls, parent=None):
        dialog = MyDialog(parent)
        result = dialog.exec_()
        if result == QDialog.Accepted:
            return dialog.my_widget.value()
        else:
            return None
Aufrufen kannst Du den Dialog dann mit "user_input = MyDialog.askUser(parent_widget)". Natürlich fehlt im obigen Beispiel noch die ".__init__()"-Methode, die den Dialog erzeugt. In dieser Methode musst Du insbesondere dafür sorgen, dass der Knopf, der den Dialog akzeptieren soll, mit dem Slot "QDialog.accept()" verbunden wird, und der Knopf, der den Dialog verwerfen soll, mit "QDialog.reject()". Den Rest solltest Du jetzt der Dokumentation entnehmen können.

Re: PyQT QDialog wird versteckt aber nicht beenden

Verfasst: Donnerstag 19. August 2010, 09:41
von Xinor
Hi ihr zwei und danke für eure Antworten.
den Code den ich gespostet habe ist natürlich nicht lauffähig. Der original Code hat auch über 400 Zeilen und ist auch lauffähig. Macht genau das was er soll, bis auf die Ausnahmen, dass es nicht das ganze QDialog beendet, sondern das QDialogfenster nur versteckt.
Hier lauffähiger Code:

Code: Alles auswählen

from PyQt4.QtCore import *
from PyQt4.QtGui import *
import sys

class MyClass(QDialog):
    def __init__(self, parent=None):
        QWidget.__init__(self, parent)
        
        # init
        # ------------------------------------------------
        self.setMinimumWidth(600)
        self.setWindowTitle("Select Dingsda")
        self.layout = QVBoxLayout()
        self.setLayout(self.layout)
        self.layoutWidget = QWidget(self)
        self.liste = []
        # widgets and layouts
        # ------------------------------------------------
        
        tempLayout = QHBoxLayout()
        self.cancelButton = QPushButton("Cancel")
        self.connect(self.cancelButton, SIGNAL('clicked()'), self.cancel)
        self.addSelectedButton = QPushButton("Add Selected")
        self.connect(self.addSelectedButton, SIGNAL('clicked()'), self.addSelected)
        tempLayout.addStretch()
        tempLayout.addWidget(self.cancelButton)
        tempLayout.addWidget(self.addSelectedButton)
        self.layout.addLayout(tempLayout)
        
        # test-data
        # ------------------------------------------------
    # methods
    # ------------------------------------------------

    def cancel(self):
        self.close()

    def addSelected(self):
        self.liste = ["1", "2", "3", "4", "5"]
        self.accept()

                    
    def exec_(self):
        if QDialog.exec_(self) == QDialog.Accepted:
            return  self.liste
        else:
            return []
            
def test():    
    app = QApplication([""])
    form = MyClass()
    i = form.exec_()
    print i
    sys.exit(app.exec_())
#-------------------------------------------------------------------------------
# main
#-------------------------------------------------------------------------------
if __name__ == "__main__":
    test()