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

时间:2016-01-13 16:19:57

标签: ruby qt crash qtruby

最近我用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内发生了崩溃。

问题是什么以及如何解决?

1 个答案:

答案 0 :(得分:1)

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数据(“application / x-qabstractitemmodeldatalist”):

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

找到问题后,对我来说似乎微不足道。不过我想分享一下,因为我浪费了太多时间。 qtruby文档警告指针参数,并提到一些不受支持的函数返回uchar指针,但没有关于返回指向Qt对象的指针的函数。由qtruby来回无缝地包装数据类型,我在那个小星号上看了很多次而没有发现它。