PyQt:RuntimeError:包装的C / C ++对象已被删除 [英] PyQt: RuntimeError: wrapped C/C++ object has been deleted

查看:679
本文介绍了PyQt:RuntimeError:包装的C / C ++对象已被删除的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如果我运行以下代码:

 #!/ usr / local / bin / python3 

从PyQt4.QtCore中导入sys
导入*从PyQt4.QtGui中导入*
导入*


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_())

...我得到这个输出:

pre $ Traceback(最近调用最后一个):
文件test.py ,第16行,在< lambda>
self.button2.clicked.connect(lambda:self.setCentralWidget(self.button1))
RuntimeError:QPushButton类型的包装C / C ++对象已被删除

我不明白为什么该对象被删除。窗口应该保持对它的引用。
我彻底调查了这些帖子:
了解底层C / C ++对象已被删除错误

可以通过查询PyQt4 QObject来确定底层C ++实例是否已被销毁? b
$ b

为什么按钮被删除?

解决方案

这里:
Python PySide(内部c ++对象已经删除)


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


If I run this code:

    #!/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_())

...I get this output:

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

I do not understand why the object is being deleted. Window should maintain a reference to it. I have thoroughly investigated these posts: 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?

Why is the button being deleted?

解决方案

This answer to this question is as found here: Python PySide (Internal c++ Object Already Deleted)

Apparently, assigning one widget to QMainWindow using setCentralWidget and then assigning another widget with setCentralWidget will cause the underlying c++ QWidget to be deleted, even though I have an object that maintains reference to it.

Note: QMainWindow takes ownership of the widget pointer and deletes it at the appropriate time.

这篇关于PyQt:RuntimeError:包装的C / C ++对象已被删除的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆