1 回答
TA贡献1839条经验 获得超15个赞
解释:
要了解问题,必须分析以下 2 个代码及其输出:
示例1
from PyQt5 import QtCore
if __name__ == "__main__":
app = QtCore.QCoreApplication([])
o = QtCore.QObject()
o.destroyed.connect(lambda: print("destroyed o"))
o = QtCore.QObject()
def on_timeout():
print("quit")
QtCore.QCoreApplication.quit()
QtCore.QTimer.singleShot(1000, on_timeout)
app.exec_()
destroyed o
quit
示例 2
from PyQt5 import QtCore
if __name__ == "__main__":
app = QtCore.QCoreApplication([])
o = QtCore.QObject()
o.destroyed.connect(lambda: print("destroyed o"))
p = o
o = QtCore.QObject()
def on_timeout():
print("quit")
QtCore.QCoreApplication.quit()
QtCore.QTimer.singleShot(1000, on_timeout)
app.exec_()
quit
destroyed o
在第一个示例中,变量“o”被分配了一个QObject,当另一个QObject被分配时,初始QObject被删除,因此在“退出”之前打印“销毁”。
在第二个示例中,它具有差异“p = o”,其中引用QObject,也就是说,在该行中“p”和“o”表示相同的对象,因此通过分配“或”一个新的QObject,初始QObject不会被破坏,并且只有在循环结束时并且GC完成其工作时才被销毁。
这就是在你的情况下以一种微妙的方式发生的事情,“p = o”的逻辑是QObject存储在另一个“地方”,而在你的例子中,“地方”是具有自己作用域的lambda(类似于部分)。具体来说,在您的示例中,创建了一个新窗口,销毁了前一个窗口,从而导致始终显示单个窗口。
溶液:
一种可能的解决方案是防止删除第一个窗口并使用标志创建新窗口:
from PyQt5 import QtCore, QtGui, QtWidgets
flag = False
# ...
def open_otherwindow():
global w, flag
if not flag:
w = OtherWindow()
w.show()
flag = True
# ...
添加回答
举报