【问题标题】:PyQt Runtime Error of QTreeWidgetItemQTreeWidgetItem 的 PyQt 运行时错误
【发布时间】: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


【解决方案1】:

我通常会避免这种错误,因为我会在我的类上保留对所有可能被删除的对象的引用,例如您的 QComboBox,所以在创建它时尝试类似 self.comboBoxHolder = QComboBox(...)

【讨论】:

  • 谢谢,但我正在继承 QComboBox。我认为你的解决方案会起作用,但问题不是我的子类被删除 - 它是它扩展的底层 C 对象......我试过了,但它没有用 - 虽然它是一个再次测试感谢的好主意。
  • 根据three_pineapples 的建议尝试制作一个简洁的工作示例后,我意识到您的解决方案是该问题的一般答案;我的 QMainWindow (最顶级的小部件)已构建,并且对它的引用甚至没有保存为局部变量。从字面上看,我做了 QMainWindow().begin_rest_of_app()。我所需要的只是一个简单的:main = QMainWindow(),然后是 main.begin_rest_of_app()。再次感谢。
猜你喜欢
  • 2012-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-06
  • 1970-01-01
  • 2016-10-11
  • 2015-09-13
  • 1970-01-01
相关资源
最近更新 更多