【发布时间】:2014-02-21 21:49:02
【问题描述】:
当底层 C/C++ 对象被删除时,我试图避免众所周知的 PyQt 运行时错误:
http://www.riverbankcomputing.com/pipermail/pyqt/2009-April/022809.html
PyQt4 - "RuntimeError: underlying C/C object has been deleted"
PyQt4 nested classes - "RuntimeError: underlying C/C++ object has been deleted"
PyQt: RuntimeError: wrapped C/C++ object has been deleted
我的每个子类都调用super() 方法,因此基类构造正确。
我仍然收到此错误,我想知道是否是因为我将 QComboBox 小部件添加到 QTreeWidgetItem(使用 setItemWidget() 的 QTreeWidget 方法),但我不能将父级设置为包含它的QTreeWidgetItem。当我尝试时,我收到以下错误:
TypeError: QComboBox(QWidget parent=None): argument 1 has unexpected type 'QTreeWidgetItem'
当然,我可以在构造函数中省略父级,也可以将QTreeWidget 作为父级传递,但我认为我需要引用正确的父级。
我已经对QComboBox 进行了子类化,并且在我的子类中它在QTreeWidget 上运行了一些基本操作,但是一旦我输入子类QComboBox 的方法,父类QTreeWidgetItem 的底层C 对象包含QComboBox 被删除(这就是为什么我认为它与设置QComboBox 的父级有关)。
我理解 10 次中有 9 次运行时错误是由于未构造基类。但是排除了这一点,错误怎么会发生呢?会不会是因为没有引用正确的父级?
编辑
我正在使用qcombobox来发出新的组合选择。在进行新选择时,它将选择的值添加到 PyXB XML 节点。有趣的是,仅当我将值附加到 PyXB 类绑定中,将信息永久存储在 XML 文件中时,才会出现此问题。换句话说,如果该部分代码没有运行,我不会收到错误消息 - 只有当代码运行 PyXB 操作以将值附加到 XML 节点绑定时...
【问题讨论】:
-
请提供一个简单的工作示例来演示该问题。如果没有看到完整的工作示例,解决您的问题的希望不大。
-
是的,我同意,但是当我几乎捆绑了一个简洁的工作示例时,我意识到该解决方案与 xndrme 的答案具有相同的思路。我的代码很大,因此与其给出冗长的解释,只要说您必须始终保存一个引用就足够了,尤其是绝对最顶层的小部件(这正是我所缺少的) .
-
是的,我认为可能会是这样。您看到的错误通常是因为您没有在应有的地方保存参考。很高兴你对它进行了排序:)
标签: python pyqt runtime-error qcombobox qtreewidgetitem