点击取消按钮时不从 QDialog 检索数据到 QMainWindow

Not retrieve data from QDialog to QMainWindow when hitting Cancel button

我正在使用 Pyside2,Python3.8

我有一个 QMainWindow 和一个 pushbutton,当按钮是 clicked 时,一个 QDialog 出现

我想在单击“添加”按钮时检索 QLineEdits 中的文本。我设法使用以下代码做到了这一点:

class Dialog(QtWidgets.QDialog, Ui_Dialog):
    def __init__(self, parent=None):
        super(Dialog, self).__init__(parent)
        self.setupUi(self)
        self.AddButton.clicked.connect(self.close)
        self.CancelButton.clicked.connect(self.close)

class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.setupUi(self)
        self.ShowDialogButton.clicked.connect(self.showDialog)

    def showDialog(self):
        d = Dialog(self)
        d.exec_()
        self.Data = [d.LineEdit1.text(), d.LineEdit2.text(), d.LineEdit3.text()]
        self.func(self.Data)

    def foo(self, foo):
        for txt in foo:
            print(txt)

if __name__== '__main__':
    app = QtWidgets.QApplication(sys.argv)
    mainWin = MainWindow()
    mainWin.show()
    sys.exit(app.exec_())

正如我所说,这有效,但问题是当我点击取消时它也有效。

我希望主窗口中的 func 函数 class 到 运行 仅当我点击添加按钮时才如此。

我怎样才能做到这一点?

连接到按钮时关闭 QDialogs 的正确方法是通过 accept() and reject(),并从 `exec() 中正确捕获 return 值。

class Dialog(QtWidgets.QDialog, Ui_Dialog):
    def __init__(self, parent=None):
        super(Dialog, self).__init__(parent)
        self.setupUi(self)
        self.AddButton.clicked.connect(<b>self.accept</b>)
        self.CancelButton.clicked.connect(<b>self.reject</b>)


class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
    # ...
    def showDialog(self):
        d = Dialog(self)
        <b>if d.exec_():
            self.Data = [d.LineEdit1.text(), d.LineEdit2.text(), d.LineEdit3.text()]
            self.func(self.Data)</b>

    # ...

您还应该考虑使用 QDialogButtonBox

我建议您只对 类 使用大写名称, 而不是 变量名。阅读官方Style Guide for Python Code