问题描述
我使用的是 Pyside2,Python 3.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_())
正如我所说,这有效,但问题是当我点击取消时它也有效。
我希望 MainWindow 类中的 func
函数仅在我点击添加按钮时运行。
我怎样才能做到这一点?
解决方法
连接到按钮时关闭 QDialogs 的正确方法是通过 accept()
和 reject()
,并正确捕获来自 `exec() 的返回值。
class Dialog(QtWidgets.QDialog,Ui_Dialog):
def __init__(self,parent=None):
super(Dialog,self).__init__(parent)
self.setupUi(self)
self.AddButton.clicked.connect(self.accept)
self.CancelButton.clicked.connect(self.reject)
class MainWindow(QtWidgets.QMainWindow,Ui_MainWindow):
# ...
def showDialog(self):
d = Dialog(self)
if d.exec_():
self.Data = [d.LineEdit1.text(),d.LineEdit2.text(),d.LineEdit3.text()]
self.func(self.Data)
# ...
您还应该考虑使用 QDialogButtonBox。
我建议你只对类使用大写的名字,不要为变量名使用。阅读有关官方 Style Guide for Python Code
的更多信息