最近,我使用Ruby和Qt编写了一个小应用程序。这是我第一个与qtruby一起做的不平凡的项目。过了一段时间,我成功地将C++引用和教程翻译成了工作的Ruby代码,并掌握了它的窍门。
只有在QTreeView小部件中实现自己的拖放功能时,我才会陷入困境。我可以将问题隔离到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崩溃似乎是不确定的,只有几次代码才起作用。错误转储和回溯没有给我任何提示,只是在QApplication::exec内部发生了崩溃。
,什么是问题,如何解决?
发布于 2016-01-13 16:19:57
用于C++的mimeData原型是:
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数据(“application/qabstractitemmodeldatalist”):
  mimeData = super
  mimeData.setData("application/x-tegi.json", encodedData)
  mimeData
end在发现这个问题之后,对我来说就显得微不足道了。尽管如此,我还是想分享它,因为我浪费了太多的时间在它上。qtruby文档警告指针参数,并提到一些不受支持的函数返回uchar指针,但没有提到返回Qt对象指针的函数。由于被qtruby无缝地来回包装数据类型所吸引,我在那个小星号上看了很多次,却没有发现它。
https://stackoverflow.com/questions/34771752
复制相似问题