PyQt4 - “RuntimeError:底层 C/C 对象已被删除”

Posted

技术标签:

【中文标题】PyQt4 - “RuntimeError:底层 C/C 对象已被删除”【英文标题】:PyQt4 - "RuntimeError: underlying C/C object has been deleted" 【发布时间】:2012-06-26 18:40:00 【问题描述】:

我不断收到这个 RuntimeError,我不确定如何解决。这就是我想要完成的事情。当我单击 QTreeView 中的不同项目时,我想用值动态更新这个 QTableWidget。在大多数情况下,我的代码可以正常工作,除非我单击第二个项目并且我需要更新我的 QTableWidgt,即当我遇到此“RuntimeError:底层 C/C 对象已被删除”时。这是我的代码的 sn-p:

def BuildTable( self ):
    ...
    for label in listOfLabels :
        attr = self.refAttr[label]
        self.table.setItem(row, 0, QtGui.QTableWidgetItem( label ) )

        tableItem = QtGui.QTableWidgetItem( str(attr.GetValue()) )
        self.table.setItem(row, 1, tableItem )
        someFunc = functools.partial( self.UpdateValues, tableItem, label )                     

        QtCore.QObject.connect(self.table, QtCore.SIGNAL('itemChanged(QTableWidgetItem*)'), someFunc)   

def UpdateValues(self, tableItem, label):
    print '--------------------------------'
    print 'UPDATING TEXT PROPERTY VALUE!!!'
    print tableItem.text()
    print label

编译器在“print tableItem.text()”这一行报错

谢谢!

【问题讨论】:

你是否继承了任何 QT 类型?如果您继承但忘记调用 c++ ctor,您经常会收到此消息。 不应有任何继承的 QT 类型。我这样声明我的表:self.table = QtGui.QTableWidget() 不。只是抱怨“print tableItem.text()”行说“RuntimeError:底层 C/C++ 对象已被删除”。请注意,只有当我单击第二个强制 QTableWidget 更新的项目时才会发生这种情况。 @JLYK:是的,这是因为您保留了可以删除的 TableWidgetItem 引用。看我的回答 你能帮我个忙吗?您当前的所有 6 个问题都是开放的。如果您认为这些问题得到了适当的解决,您能否接受一些答案?它会开始拒绝别人帮助你。我意识到我在 5 月份为您回答了一个尚未解决的问题。如果这些以前的问题没有按照您的喜好回答,请尝试向人们提供一些关于它们的信息。 【参考方案1】:

我认为问题在于您将回调与 QTableWidget 项目绑定并建立了许多连接(坏)。项目可以改变。因此,它们可以被删除,从而使您的回调失效。

你想要的只是让itemChanged 信号告诉你什么项目发生了变化,发生的那一刻。

self.table = QtGui.QTableWidget()
...
# only do this once...ever...on the init of the table object
QtCore.QObject.connect(
    self.table, 
    QtCore.SIGNAL('itemChanged(QTableWidgetItem*)'), 
    self.UpdateValues
)

然后在您的 SLOT 中,它将收到该项目:

def UpdateValues(self, tableItem):
    print '--------------------------------'
    print 'UPDATING TEXT PROPERTY VALUE!!!'
    print tableItem.text()

【讨论】:

嗯...如果它不在 for 循环中,那么我怎么知道我传入的是哪个 tableItem?我的 UpdateValues 函数也接受多个参数。 您没有将插槽绑定到项目。该表会在任何​​项目发生更改以及该项目是什么时通知您。它会通过的。 只是想补充一点,你可以用部分和绑定参数做你正在做的事情。只需在预期的 qt 参数之后在您的 SLOT 中使用关键字参数。喜欢:部分(函数,颜色='红色')。但要小心任何可以来来去去的物体。 如果我的其中一个桌面项目是组合框会怎样?我可以将它保存在我的 for 循环中吗?似乎只有在我更改值时才会调用它。 无论任何类型的小部件,如果您多次建立相同的连接,它将被多次调用。你能解释一下为什么你认为你需要在 for 循环中建立连接吗?

以上是关于PyQt4 - “RuntimeError:底层 C/C 对象已被删除”的主要内容,如果未能解决你的问题,请参考以下文章

运动生成器 2016 PyQt4

如何让 PyQt4 与 PyCharm 一起工作

导入 PyQt4 模块

python 安装PyQt4

PyQT4 库的问题

PyQt4 - 拖放