如果我运行这段代码:
#!/usr/local/bin/ python3
import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
class Window(QMainWindow):
def __init__(self):
super().__init__()
self.button1 = QPushButton("1")
self.button2 = QPushButton("2")
self.setCentralWidget(self.button1)
self.button1.clicked.connect(lambda: self.setCentralWidget(self.button2))
self.button2.clicked.connect(lambda: self.setCentralWidget(self.button1))
self.show()
if __name__ == '__main__':
import sys
app = QApplication(sys.argv)
window = Window()
sys.exit(app.exec_())
...我得到了这个输出:
Traceback (most recent call last):
File "test.py", line 16, in <lambda>
self.button2.clicked.connect(lambda: self.setCentralWidget(self.button1))
RuntimeError: wrapped C/C++ object of type QPushButton has been deleted
我不明白为什么对象被删除了。窗口应该保留对它的引用。 我已经彻底调查了这些帖子: Understanding the “underlying C/C++ object has been deleted” error Can a PyQt4 QObject be queried to determine if the underlying C++ instance has been destroyed?
为什么按钮会被删除?
__init__
开头调用QWidget的__init__
了。有点诡异。 - spookypeanuta.call_some_parent_method()
,其中a = QObjectA(parent=QObjectB())
,引发了一个RuntimeError: wrapped C/C++ object of type QObjectA has been deleted
。然而,实际原因是被包装的类型为QObjectB
的对象已被删除(而不是错误消息中提到的QObjectA
)。解决方案是同时保留对QObjectB
的引用:b = QObjectB(); a = QObjectA(parent=b)
(使用 Python 2.7、PyQt5)。 - djvgQWidget
实例的属性被删除了。原来我只把QWidget
实例保存到了一个局部变量中,因此垃圾回收器会在变量超出作用域时立即删除其属性。通过保留对QWidget
实例的永久引用来解决了这个问题。 - SomeDude