You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:22:45