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
相关产品推荐
相关产品推荐

