PyQt5/PyQt6中未存控件到变量导致显示后消失的原因咨询
Qt窗口短暂显示后消失的原因
先看两种代码对比:
正常运行的代码
if __name__ == '__main__': app: QtWidgets.QApplication = QtWidgets.QApplication(System.argv) window = Calculator() window.show() System.exit(app.exec_())
窗口短暂消失的代码
if __name__ == '__main__': app: QtWidgets.QApplication = QtWidgets.QApplication(System.argv) Calculator().show() System.exit(app.exec_())
核心原因:对象生命周期与引用计数
- 第一种写法中,
Calculator()创建的实例被赋值给了window变量,这个变量会一直存在于当前作用域直到app.exec_()执行完毕。Python的引用计数机制会因为这个变量的存在,保持窗口对象的引用,Qt就能正常维护窗口的显示状态。 - 第二种写法里,
Calculator()是一个临时对象,执行完show()这行代码后,没有任何变量持有这个对象的引用。Python的垃圾回收机制会立即销毁这个临时的窗口对象,导致窗口从屏幕上消失。而Qt的事件循环app.exec_()仍在运行,所以程序不会退出,但窗口已经不存在了。
额外说明:Qt中无父对象的顶层窗口,其生命周期完全由Python的引用计数控制。如果给窗口指定父对象,父对象的存在会保留子窗口的引用,这种情况下临时对象可能不会被立即回收,但这不是常规写法,建议始终用变量持有窗口实例来避免这类问题。
内容的提问来源于stack exchange,提问作者Keworker
相关产品推荐
相关产品推荐

