1

最近我用 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

问题是什么?如何解决?

4

1 回答 1

1

的 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/x-qabstractitemmodeldatalist”):

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

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

于 2016-01-13T16:19:57.173 回答