2015-02-24 5 views
7

Я работаю над пользовательским интерфейсом в PyQt, и у меня возникают проблемы с использованием QDialog. По существу у меня есть главный виджет и суб-виджет, сохраненный в отдельных файлах .py; Я хотел бы, чтобы суб-виджет открывался, когда я нажимаю на определенную кнопку в главном виджетах. Кажется, это нормально.PyQt QDialog - возврат значения и закрытие из диалогового окна

Проблема возникает с возвратом и закрытием. У меня есть кнопка «отправить» в моем субвизоре - когда пользователь нажимает на эту кнопку, я хотел бы вернуть значение (словарь, сделанный с их ввода), в главный виджет и закрыть суб-виджет. Я не могу сделать ничего из этого с кодом, который у меня есть сейчас.

Применимых бит кода в главном виджете (можно добавить больше, чтобы сделать его самодостаточным, если проблема не очевидна):

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

Я никогда, кажется, попал в код после Условного оператора ,

применимый код из моего суб-виджета (будет включать в себя немного больше, здесь):

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

* Я попытался ex.close() здесь, но бывший не распознается, когда этот виджет запускается как диалог. Кажется, он не должен попасть в эту строку из-за оператора return, но я не знаю, как еще закрыть этот виджет после того, как пользователь нажмет «отправить». Или должен ли этот диалог dialog.accept() в моем главном виджете?

Последнее, что мне нужно в моем субвизоре, поскольку оно выполняется через мой главный виджет?

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

Заранее благодарен! Я довольно новичок в PyQt, поэтому, надеюсь, это несколько разборчиво.

ответ

12

Есть несколько вопросов. Линия if dialog.exec_(): будет успешной только в том случае, если диалог завершен с accept(). Вы работаете с QDesigner? Если да, проверьте this на другой способ работы. Если Ui_ShowGroupWidget просто содержит код, который вы пишете, вы должны сделать его наследованием QDialog вместо QWidget. Затем, вместо закрытия self.close(), вы закрываете его с помощью self.accept(). Вы не можете вернуть diccionary, но вы можете сохранить его как атрибут объекта. Как только возвращается dialog.exec_(), вы можете получить доступ к этому атрибуту.

Это может быть что-то вроде этого:

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

Другой:

... 

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

наконец, if __name__=='__main__': означает "если этот файл выполняется в качестве основного файла, затем ..", это не так, поскольку вы включаете и используете его из другого. Поэтому вы можете удалить его, однако идея состоит в том, что вы можете запустить python ui_mywidget.py, чтобы проверить его или увидеть Ui, определенный в этом файле.

+0

Это исправило это - большое вам спасибо! –

 Смежные вопросы

  • Нет связанных вопросов^_^