如果我运行这段代码:
#!/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
我不明白为什么该对象被删除。窗口应该维护对它的引用。
我已经彻底调查了这些帖子:了解“底层 C/C++ 对象已被删除”错误 https://stackoverflow.com/questions/6002895/understanding-the-underlying-c-c-object-has-been-deleted-error
是否可以查询 PyQt4 QObject 以确定底层 C++ 实例是否已被销毁? https://stackoverflow.com/questions/5122451/can-a-pyqt4-qobject-be-queried-to-determine-if-the-underlying-c-instance-has-b?rq=1
为什么按钮被删除?
这个问题的答案可以在这里找到:Python PySide(内部 c++ 对象已删除) https://stackoverflow.com/questions/5339062/python-pyside-internal-c-object-already-deleted
显然,使用 setCentralWidget 将一个小部件分配给 QMainWindow,然后使用 setCentralWidget 分配另一个小部件将导致底层 C++ QWidget 被删除,即使我有一个维护对其引用的对象。
注意:QMainWindow 获得小部件指针的所有权并在适当的时间将其删除。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)