PyQt问题:主窗口打开的对话框需点击两次OK才关闭
问题排查与修复方案
嘿,我一眼就看到问题所在了——你在处理对话框返回结果的时候,不小心重复调用了对话框的exec_()方法,导致第一次点击OK后对话框又被重新打开了!
具体问题点
看你AppWindow类里的dialogParametersOpen方法:
def dialogParametersOpen(self): dialogParameters = CreateParameterDialog() if dialogParameters.exec_(): # ... 数据传输逻辑 print('Dialog Completed with ' + str(dialogParameters.exec_())) # 这里是坑!
当你第一次调用dialogParameters.exec_()时,对话框启动事件循环,你点击OK触发accept(),此时exec_()返回True,进入if块。但你在块的最后又调用了一次dialogParameters.exec_(),这相当于再次打开了对话框,所以你必须再点一次OK让这个第二次的exec_()返回,对话框才会真正关闭。
另外还有个小拼写bug:CreateParameterDialog里的取消按钮连接写成了self.pusBtnCancel,少了个h,应该是self.pushBtnCancel,不然Cancel按钮会完全没反应。
修复后的代码
1. 修正dialogParametersOpen方法
删掉重复的exec_()调用:
def dialogParametersOpen(self): dialogParameters = CreateParameterDialog() if dialogParameters.exec_(): print("Speed: %s, Rounds: %s, Overlap: %s " % ( str(dialogParameters.lblSpeedValue.text()), str(dialogParameters.spinBoxRounds.value()), str(dialogParameters.lblOverlapValue.text()) )) self.hSliderSpeed.setValue(dialogParameters.hSliderSpeed.value()) self.spinBoxRounds.setValue(dialogParameters.spinBoxRounds.value()) self.hSliderOverlapDeg.setValue(dialogParameters.hSliderOverlap.value()) print('Dialog Completed with Accepted status') # 替换原来的重复调用
2. 修正取消按钮的拼写错误
class CreateParameterDialog(QtGui.QDialog, Ui_DialogParameters2): def __init__(self): super().__init__() self.setupUi(self) # 如果需要用这个信号传递数据,要改成实例属性(原来的局部变量无法被外部访问) self.sendParametersData = QtCore.pyqtSignal(int,int,int) self.pushBtnOK.clicked.connect(self.accept) self.pushBtnCancel.clicked.connect(self.reject) # 修正拼写 self.hSliderOverlap.valueChanged.connect(self.lblOverlapValue.setNum) self.hSliderSpeed.valueChanged.connect(self.updateSpeedData)
额外提示
你原来定义的sendParametersData是局部变量,这样在类外部根本无法使用这个信号。如果后续需要通过信号来传递对话框数据,一定要把它定义为类的实例属性(就像上面代码里那样)。
这样修改后,点击一次OK按钮,对话框就会正常关闭,数据也能正确同步到主窗口啦!
内容的提问来源于stack exchange,提问作者Maanas
相关产品推荐
相关产品推荐

