PyQt QDialog-возврат значения и закрытие из диалога

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

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

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

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

кажется, я никогда не попадаю в код после оператора if.

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

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.закрыть () здесь как Ну, но ex не распознается, когда этот виджет запускается как диалоговое окно. Не похоже, что он должен попасть в эту строку из-за оператора return, но я не знаю, как еще закрыть этот виджет после того, как пользователь нажмет "отправить". Или диалог.accept () в моем основном виджете обрабатывает это?

последнее - нужно ли мне это в моем суб-виджете вообще, так как он запускается через мой основной виджет?

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

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

1 ответов


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

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

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 чтобы проверить его или увидеть пользовательский интерфейс, определенный в этом файле