[PyQt] RuntimeError: underlying C/C++ object has been deleted

Mads Ipsen mpi at comxnet.dk
Thu Apr 23 11:58:21 BST 2009


> Os Windows Vista Home Ru + sp1
> g++ (GCC) 3.4.5 (mingw-vista special r3)
> Qt 4.5 (self build)
> sip-4.7.9 (self build)
> PyQt-win-gpl-4.4.4.zip (self build)
>
> I was unable to allocate a minimum example. Here is pseudocode situations:
> [code]
>
> class BaseData(QObject):
>    def save(self, obj):
>      self.emit(QtCore.SIGNAL('datat_change'), obj)
>
> class Model(QAbstractItemModel):
>    def __init__(self, data):
>      #  data Mast be derived from BaseData
>      self.connect(
>        data, QtCore.SIGNAL('data_change'), self.__data_changes)
>
>    def __data_changes(self, arg):
>      row = self.__getRowForArg(arg)
>      ind = self.createIndex(row, 0, self.objects[row]) #!!! RuntimeError
>
> class Mixin(object):
>    data = None #Mast be derived from BaseData
>    result = None #Setup brfore accept()
>    def __init__(self, ...):
>      ...
>    def initUi(self):
>      ui = self.__ui = Ui_DlgFrame()
>      ui.setupUi(self)
>      model = self.__model = self.Model(self.dataCls.singleton())
>      ui.tableView.setModel(model)
>
> class DlgFrame(QDialog, Mixin):
>    def __init__(self, data, parent=None, ...):
>      QDialog.__init__(self, parent)
>      Mixin.__init__(self, ...)
>      self.initUi()
>
>    @classmethod
>    def getRes(cls, parent ...):
>      frm = cls(parent, ...)
>      if frm.exec_() == QtGui.QDialog.Accepted:
>        return frm._result
>      return None
>
> class FinalDlg(DlgFrame, ...):
>    # This class generated by function 'type'
>    dataCls = FinalData #Derived from BaseData
>
> class Main(QMainWindow):
>    def __init__(self):
>      data = FinalData.singleton()
>
>    @QtCore.pyqtSignature('')
>    def on_btGetRes_clicked(self):
>      self.res = FinalDlg.getRes(self, ...)
>
>    @QtCore.pyqtSignature('')
>    def on_btSaveRes_clicked(self):
>      self.data.save(self.res)
> [/code]
> Scenario for reproduction:
> start Application
> press btGetRes
> press btSaveRes
>
> In PyQt-win-gpl-4.5-snapshot-20090419.zip error also.
> _______________________________________________
> PyQt mailing list    PyQt at riverbankcomputing.com
> http://www.riverbankcomputing.com/mailman/listinfo/pyqt
>


When you inherit from a Qt base class, you must always call the
constructor of the base class in the derived class. For example:

class BaseData(QObject):
  def __init__(self):
    QObject.__init__(self)
    ...

class Model(QAbstractItemModel):
  def __init__(self, data):
    QAbstractItemModel.__init__(self)
    ...

Best regards,

Mads


More information about the PyQt mailing list