PyQt QDialog - 返回一个值并从对话框中关闭
PyQt QDialog - returning a value and closing from dialog
我正在使用 PyQt 开发用户界面,运行我在尝试使用 QDialog 时遇到了一些问题。本质上,我有一个主小部件和一个子小部件,保存在单独的 .py 文件中;我希望在单击主小部件中的某个按钮时打开子小部件。这个好像开的不错。
问题伴随着 returning 和关闭。我的子小部件上有一个 "submit" 按钮 - 当用户单击此按钮时,我想 return 一个值(根据他们的输入生成的字典)到主小部件,然后关闭子小部件- 小部件。我似乎无法用我现在拥有的代码来做这些事情。
主小部件中的适用代码(如果问题不明显,可以添加更多代码使其独立):
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.close(),但是当这个小部件 运行 作为对话框时,无法识别 ex。由于 return 语句,它似乎不应该到达这一行,但我不知道在用户点击 "submit" 后如何关闭此小部件。或者我的主要小部件中的 dialog.accept() 应该处理那个吗?
最后一件事 - 我是否需要在我的子窗口小部件中使用它,因为它是 运行 通过我的主窗口小部件?
if __name__=='__main__':
app=QtGui.QApplication(sys.argv)
ex=Ui_ShowGroupWidget()
ex.show()
sys.exit(app.exec_())
提前致谢!我是 PyQt 的新手,所以希望这有点清晰。
有几个问题。只有使用 accept()
退出对话框时,if dialog.exec_():
行才会成功。您在使用 QDesigner 吗?如果是这样,请检查 以了解不同的工作方式。如果Ui_ShowGroupWidget
只是包含你写的代码,你应该让它继承QDialog而不是QWidget。然后,不是用 self.close()
关闭它,而是用 self.accept()
关闭它。您不能 return 词典,但可以将其保存为对象属性。在 dialog.exec_()
return 之后,您可以访问该属性。
可能是这样的:
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__':
表示 "if this file is executed as the main file, then..",实际情况并非如此,因为您是从另一个人那里包含和使用它的。所以你可以删除它,但是,想法是你可以 运行 python ui_mywidget.py
来测试它或查看在该文件上定义的 Ui
我正在使用 PyQt 开发用户界面,运行我在尝试使用 QDialog 时遇到了一些问题。本质上,我有一个主小部件和一个子小部件,保存在单独的 .py 文件中;我希望在单击主小部件中的某个按钮时打开子小部件。这个好像开的不错。
问题伴随着 returning 和关闭。我的子小部件上有一个 "submit" 按钮 - 当用户单击此按钮时,我想 return 一个值(根据他们的输入生成的字典)到主小部件,然后关闭子小部件- 小部件。我似乎无法用我现在拥有的代码来做这些事情。
主小部件中的适用代码(如果问题不明显,可以添加更多代码使其独立):
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.close(),但是当这个小部件 运行 作为对话框时,无法识别 ex。由于 return 语句,它似乎不应该到达这一行,但我不知道在用户点击 "submit" 后如何关闭此小部件。或者我的主要小部件中的 dialog.accept() 应该处理那个吗?
最后一件事 - 我是否需要在我的子窗口小部件中使用它,因为它是 运行 通过我的主窗口小部件?
if __name__=='__main__':
app=QtGui.QApplication(sys.argv)
ex=Ui_ShowGroupWidget()
ex.show()
sys.exit(app.exec_())
提前致谢!我是 PyQt 的新手,所以希望这有点清晰。
有几个问题。只有使用 accept()
退出对话框时,if dialog.exec_():
行才会成功。您在使用 QDesigner 吗?如果是这样,请检查 Ui_ShowGroupWidget
只是包含你写的代码,你应该让它继承QDialog而不是QWidget。然后,不是用 self.close()
关闭它,而是用 self.accept()
关闭它。您不能 return 词典,但可以将其保存为对象属性。在 dialog.exec_()
return 之后,您可以访问该属性。
可能是这样的:
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__':
表示 "if this file is executed as the main file, then..",实际情况并非如此,因为您是从另一个人那里包含和使用它的。所以你可以删除它,但是,想法是你可以 运行 python ui_mywidget.py
来测试它或查看在该文件上定义的 Ui