Qt::AbstractItemModel::mimeData中的Qt/Ruby应用程序崩溃-如何查找和修复原因?

Qt::AbstractItemModel::mimeData中的Qt/Ruby应用程序崩溃-如何查找和修复原因?,ruby,qt,crash,qtruby,Ruby,Qt,Crash,Qtruby,最近,我使用Ruby和Qt编写了一个小应用程序。这是我使用qtruby的第一个非平凡项目。过了一段时间,我设法把C++的参考文献和教程翻译成工作的红宝石代码,并掌握了它。p> 只有在QTreeViewwidgets中实现我自己的拖放功能时,我才真正陷入困境。我可以将问题隔离到Qt::AbstractItemModel::mimeData方法。在消除了一些其他错误之后,我最终得到了以下代码,这些代码导致应用程序在发生拖动操作时立即崩溃 class TreeModel < Qt::Abstra

最近,我使用Ruby和Qt编写了一个小应用程序。这是我使用qtruby的第一个非平凡项目。过了一段时间,我设法把C++的参考文献和教程翻译成工作的红宝石代码,并掌握了它。p> 只有在
QTreeView
widgets中实现我自己的拖放功能时,我才真正陷入困境。我可以将问题隔离到
Qt::AbstractItemModel::mimeData
方法。在消除了一些其他错误之后,我最终得到了以下代码,这些代码导致应用程序在发生拖动操作时立即崩溃

class TreeModel < Qt::AbstractItemModel
  def mimeData(indexlist)
    encodedData = Qt::ByteArray.new("")
    stream = Qt::DataStream.new(encodedData, Qt::IODevice::WriteOnly)  

    indexlist.each do |index|
      if index.column == 0
        if index.isValid
          stream << index.item.mime_data.to_json
        end
      end
    end

    mimeData = Qt::MimeData.new
    mimeData.setData("application/x-tegi.json", encodedData)
    mimeData
  end
end
classtreemodel流< p>对于<代码> MIMEDATA <代码>的C++原型是:

QMimeData * QAbstractItemModel::mimeData 
  ( const QModelIndexList & indexes ) const [virtual]
该方法返回指向
QMimeData
对象的指针。我的
mimeData
实现是返回一个指向局部变量的指针。因此,非确定性崩溃

一旦发现,解决问题就很容易了。实例变量将保持活动状态并保持其值,直到下一次调用
mimeData

  @mimeData = Qt::MimeData.new
  @mimeData.setData("application/x-tegi.json", encodedData)
  @mimeData
end
另一种可能是调用
super
,将构造和解构留给超类。这也会继承默认mime数据(“应用程序/x-qabstractitemmodeldatalist”):

在发现问题后,我觉得它微不足道。尽管如此,我还是想分享它,因为我浪费了太多的时间。qtruby文档警告指针参数,并提到一些不受支持的函数返回
uchar
指针,但没有关于函数将指针返回到Qt对象的消息。在qtruby无缝地来回包装数据类型的催眠下,我在那个小星号上看了很多遍都没有发现它

  mimeData = super
  mimeData.setData("application/x-tegi.json", encodedData)
  mimeData
end