最近,我使用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内部。

有什么问题,如何解决?

最佳答案

mimeData的C++原型(prototype)是:

QMimeData * QAbstractItemModel::mimeData
  ( const QModelIndexList & indexes ) const [virtual]

该方法返回一个指向QMimeData对象的指针。我对mimeData的实现是返回指向本地变量的指针。因此,不确定性崩溃。

一旦发现,解决该问题很容易。实例变量将保持 Activity 状态并保持其值,直到下一次调用mimeData为止:
  @mimeData = Qt::MimeData.new
  @mimeData.setData("application/x-tegi.json", encodedData)
  @mimeData
end

另一种可能性是调用super并将构造和解构操作留给 super class 。这还将继承默认的mime数据(“application / x-qabstractitemmodeldatalist”):
  mimeData = super
  mimeData.setData("application/x-tegi.json", encodedData)
  mimeData
end

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

关于ruby - Qt::AbstractItemModel::mimeData中的Qt/Ruby应用程序崩溃-如何查找并解决原因?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34771752/

10-09 22:45