PyQt:RuntimeError:包装的C/C++对象已被删除

Bri*_*ian 14 garbage-collection pyqt pyqt4 qobject qmainwindow

如果我运行此代码:

    #!/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_())
Run Code Online (Sandbox Code Playgroud)

...我得到这个输出:

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
Run Code Online (Sandbox Code Playgroud)

我不明白为什么要删除该对象.窗口应该保持对它的引用.我已经彻底调查了这些帖子: 了解"基础C/C++对象已被删除"错误是否 可以查询PyQt4 QObject以确定底层C++实例是否已被销毁?

为什么按钮被删除?

Bri*_*ian 14

这个问题的答案如下所示: Python PySide(内部c ++对象已被删除)

显然,使用setCentralWidget将一个窗口小部件分配给QMainWindow,然后使用setCentralWidget分配另一个窗口小部件将导致删除基础c ++ QWidget,即使我有一个维护对它的引用的对象.

注意:QMainWindow获取小部件指针的所有权并在适当的时候删除它.