2015-02-24 19 views
7

Ich arbeite an einer Benutzeroberfläche in PyQt, und ich habe ein paar Probleme mit dem Versuch, QDialog zu verwenden. Im Wesentlichen habe ich ein Haupt-Widget und ein Sub-Widget, die in separaten .py-Dateien gespeichert sind; Ich möchte das Unter-Widget öffnen, wenn ich auf eine bestimmte Schaltfläche im Haupt-Widget klicke. Dies scheint sich gut zu öffnen.PyQt QDialog - Rückgabe eines Wertes und Schließen aus dem Dialog

Das Problem kommt mit dem Zurückbringen und Schließen. Ich habe eine Schaltfläche "Submit" auf meinem Sub-Widget - wenn der Benutzer auf diese Schaltfläche klickt, möchte ich einen Wert (ein Wörterbuch aus ihrer Eingabe) an das Haupt-Widget zurückgeben und das Sub-Widget schließen. Ich kann keines dieser Dinge mit dem Code, den ich gerade habe, tun.

Anwendbar Bit-Code im Haupt Widget (mehr hinzuzufügen umluftunabhängigem zu machen, wenn das Problem nicht offensichtlich ist):

import SGROIWidget_ui 

def retranslateUi(self, ROIGUI): 
    #ShowGroupROI is a push-button 
    self.ShowGroupROI.clicked.connect(self.ShowGroupROIFunction) 

def ShowGroupROIFunction(self): 
    dialog = QDialog() 
    dialog.ui = SGROIWidget_ui.Ui_ShowGroupWidget() 
    dialog.ui.setupUi(dialog) 
    dialog.setAttribute(QtCore.Qt.WA_DeleteOnClose) 
    if dialog.exec_(): 
     roiGroups=dialog.Submitclose() 
     print(roiGroups) 
     dialog.accept() 

Ich scheine nie den Code nach der if-Anweisung getroffen .

Der anwendbare Code von meinem Sub-Widget (ein bisschen mehr hier enthalten):

try: 
    _fromUtf8 = QtCore.QString.fromUtf8 
except AttributeError: 
    def _fromUtf8(s): 
     return s 

try: 
    _encoding = QtGui.QApplication.UnicodeUTF8 
    def _translate(context, text, disambig): 
     return QtGui.QApplication.translate(context, text, disambig, _encoding) 
except AttributeError: 
    def _translate(context, text, disambig): 
     return QtGui.QApplication.translate(context, text, disambig) 

class Ui_ShowGroupWidget(QtGui.QWidget): 
    def __init__(self): 
     QtGui.QWidget.__init__(self) 
     self.setupUi(self) 

    def setupUi(self, ShowGroupWidget): 
     #sets up Submit button 

    def retranslateUi(self, ShowGroupWidget): 
     self.Submit.clicked.connect(self.Submitclose) 

    def Submitclose(self): 
     roiGroups={} 
     #roiGroups gets set up here as a dictionary 
     #It prints nicely from here so I know it's not the issue 

     return roiGroups 
     #I don't know if I can just do a return statement like this? 
     self.close()* 

* ich auch hier versucht haben ex.close(), aber ex nicht erkannt wird, wenn dieses Widget ausgeführt wird als ein Dialog. Es scheint nicht so, dass es wegen der return-Anweisung zu dieser Zeile kommen sollte, aber ich weiß nicht, wie ich das Widget sonst schließen soll, nachdem der Benutzer "submit" gedrückt hat. Oder sollte das dialog.accept() in meinem Haupt-Widget das behandeln?

Eine letzte Sache - brauche ich das überhaupt in meinem Sub-Widget, da es stattdessen durch mein Haupt-Widget läuft?

if __name__=='__main__': 
    app=QtGui.QApplication(sys.argv) 
    ex=Ui_ShowGroupWidget() 
    ex.show() 
    sys.exit(app.exec_()) 

Vielen Dank im Voraus! Ich bin ziemlich neu bei PyQt, also hoffentlich ist das etwas leserlich.

Antwort

12

Es gibt ein paar Probleme. Die Zeile if dialog.exec_(): ist nur erfolgreich, wenn der Dialog mit accept() beendet wird. Arbeitest du mit QDesigner? Wenn ja, überprüfen Sie this für eine andere Arbeitsweise. Wenn Ui_ShowGroupWidget nur Code enthält, den Sie schreiben, sollten Sie QDialog anstelle von QWidget erben lassen. Dann, anstatt es mit self.close() zu schließen, schließen Sie es mit self.accept(). Sie können ein Diccionary nicht zurückgeben, aber Sie können es als Objektattribut speichern. Sobald die dialog.exec_() zurückgegeben wird, können Sie auf dieses Attribut zugreifen.

Es könnte so etwas wie dieses:

def ShowGroupROIFunction(self): 
    dialog = SGROIWidget_ui.Ui_ShowGroupWidget() 
    if dialog.exec_(): 
     print(dialog.roiGroups) 

Der andere:

... 

class Ui_ShowGroupWidget(QtGui.QDialog): 
    def __init__(self): 
     QtGui.QDialog.__init__(self) 
     self.setupUi(self) 
     self.roiGroups = {} 
     self.Submit.clicked.connect(self.submitclose) 

    def setupUi(self, ShowGroupWidget): 
     #sets up Submit button 

    def submitclose(self): 
     #do whatever you need with self.roiGroups  
     self.accept() 

Endlich if __name__=='__main__': bedeutet "wenn diese Datei als Hauptdatei ausgeführt wird, dann ..", was nicht der Fall ist, da Sie es von einem anderen einbeziehen und verwenden. So können Sie es entfernen, aber die Idee ist, dass Sie python ui_mywidget.py ausführen können, um es zu testen oder zu sehen, die Ui für diese Datei

+0

festgelegt, die es behoben - vielen Dank! –