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

Qt多窗口开发问题:第二窗口按钮无法触发绑定函数

问题分析与解决方案:Qt第二窗口按钮无法触发绑定函数

嘿,我一眼就揪出问题所在了——你的SecondWindow实例被Python的垃圾回收机制悄悄清理掉了,导致按钮的信号连接直接失效!

核心问题拆解

看你selectPhase方法里这段代码:

def selectPhase(self):
    Nbus = dlg.lineEdit_3.text()
    if Nbus == "1":
        self.SW = uic.loadUi("try1.ui")
        SecondWindow(self.SW) # 这里创建的实例没被保存!
    else:
        print("try again")

你创建了SecondWindow的实例,但没把它赋值给任何能持久化的变量(比如MainWindow的属性)。当selectPhase函数执行完,这个临时实例就会被Python判定为“无用对象”回收掉,对应的按钮点击信号连接自然就失效了——这就是为啥点按钮没反应。

快速修复方案

只需要把SecondWindow的实例保存到MainWindow的属性里,让它和主窗口的生命周期绑定,就不会被提前回收了:

def selectPhase(self):
    Nbus = dlg.lineEdit_3.text()
    if Nbus == "1":
        self.SW = uic.loadUi("try1.ui")
        # 把实例保存到self的属性中
        self.second_window = SecondWindow(self.SW) 
    else:
        print("try again")

改完之后,点击第二窗口的按钮就能正常触发tst()函数,打印"testing"了。

额外的代码优化建议

顺便提两个小细节,避免后续踩坑:

  • 你在Calc和disableButton方法里直接用全局的dlg变量,而不是已经存在的self.dlg。建议统一改成self.dlg,比如:
    def Calc(self):
        Vbase=float(self.dlg.comboBox.currentText())
        currentBase = ((Sbase)/ (math.sqrt(3) * (Vbase*1e3)))
        # 用self.dlg代替全局dlg
        self.dlg.currentBase.setText(str(make_prefix(currentBase))+"A")
        baseImpedance = (((Vbase*1e3)*(Vbase*1e3)) / (Sbase))
        self.dlg.baseImpedance.setText(str(make_prefix(baseImpedance))+" p.u.")
    
  • disableButton里的dlg.pushButton_3也改成self.dlg.pushButton_3,减少对全局变量的依赖,让代码更健壮。

内容的提问来源于stack exchange,提问作者Klien Menard

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 06:23:30