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