【问题标题】:PyQt QDialog - returning a value and closing from dialogPyQt QDialog - 返回一个值并从对话框关闭
【发布时间】:2015-04-26 17:12:08
【问题描述】:

我正在开发 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.close(),但是当这个小部件作为对话框运行时 ex 无法识别。由于 return 语句,它似乎不应该到达这一行,但我不知道在用户点击“提交”后如何关闭这个小部件。或者我的主小部件中的 dialog.accept() 应该处理吗?

最后一件事 - 我是否需要在我的子小部件中使用它,因为它是通过我的主小部件运行的?

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

提前致谢!我对 PyQt 很陌生,所以希望这有点清晰。

【问题讨论】:

    标签: python qt user-interface pyqt qdialog


    【解决方案1】:

    有几个问题。只有在使用accept() 退出对话框时,if dialog.exec_(): 行才会成功。您在使用 QDesigner 吗?如果是这样,请检查 this 以了解其他工作方式。如果Ui_ShowGroupWidget 只包含你写的代码,你应该让它继承QDialog 而不是QWidget。然后,不是用self.close() 关闭它,而是用self.accept() 关闭它。您不能返回字典,但可以将其保存为对象属性。一旦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

    【讨论】:

    • 你成就了我的一天^^
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多