2015-02-24 12 views
7

Pracuję nad interfejsem użytkownika w PyQt i mam kilka problemów przy próbie użycia QDialog. Zasadniczo mam widżet główny i pod-widget, zapisane w oddzielnych plikach .py; Chciałbym otworzyć pod-widget po kliknięciu określonego przycisku w głównym widgecie. Wydaje się, że otwiera się dobrze.PyQt QDialog - zwracanie wartości i zamykanie z okna dialogowego

Problem dotyczy zwrotu i zamknięcia. Mam przycisk "submit" na moim pod-widżecie - kiedy użytkownik kliknie ten przycisk, chciałbym zwrócić wartość (słownik zrobiony z ich danych wejściowych) do głównego widgetu i zamknąć pod-widget. Nie mogę zrobić żadnej z tych rzeczy za pomocą kodu, który mam teraz.

Odpowiednie fragmenty kodu w głównym widget (można dodać więcej, aby uczynić to samowystarczalny jeśli problem nie jest oczywiste):

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() 

nie wydaje mi się trafić na kod po IF-oświadczenie .

Obowiązujący kod z mojego sub-widget (będzie zawierać trochę więcej tutaj):

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()* 

* Próbowałem ex.close(), ale tutaj również ex nie jest rozpoznany, kiedy ten widget jest prowadzony jako dialog. Wygląda na to, że nie powinien dostać się do tej linii z powodu instrukcji return, ale nie wiem, jak zamknąć ten widget po tym, jak użytkownik kliknie "submit". A może powinien to zrobić dialog.accept() w moim głównym widżecie?

Ostatnia rzecz - czy w ogóle potrzebuję tego w moim podrzędnym widgetu, ponieważ zamiast tego jest on uruchamiany przez mój główny widget?

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

Z góry dziękuję! Jestem całkiem nowy w PyQt, więc mam nadzieję, że jest to trochę czytelne.

Odpowiedz

12

Istnieje kilka problemów. Linia if dialog.exec_(): zakończy się pomyślnie, jeśli okno dialogowe zostanie zamknięte z accept(). Czy pracujesz z QDesigner? Jeśli tak, sprawdź this, aby uzyskać inny sposób pracy. Jeśli Ui_ShowGroupWidget zawiera tylko kod, który napiszesz, powinieneś go dziedziczyć QDialog zamiast QWidget. Następnie, zamiast zamykać je za pomocą self.close(), zamyka się je przy pomocy self.accept(). Nie możesz zwrócić diety, ale możesz ją zapisać jako atrybut obiektu. Po zwróceniu dialog.exec_() możesz uzyskać dostęp do tego atrybutu.

To może być coś takiego:

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

Drugi:

... 

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() 

Wreszcie if __name__=='__main__': znaczy "jeśli plik ten jest wykonywany jako główny plik, a następnie .." co nie jest tak, jak się je zawiera i używa z innego. Więc możesz go usunąć, ale pomysł jest taki, że możesz go uruchomić, aby przetestować lub zobaczyć Ui zdefiniowane w tym pliku.

+0

To naprawiło to - dziękuję bardzo! –

Powiązane problemy