【问题标题】:Qt/Ruby Application Crash in Qt::AbstractItemModel::mimeData - How to find and fix the cause?Qt::AbstractItemModel::mimeData 中的 Qt/Ruby 应用程序崩溃 - 如何查找并修复原因?
【发布时间】:2016-01-13 16:19:57
【问题描述】:

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

问题是什么?如何解决?

【问题讨论】:

    标签: ruby qt crash qtruby


    【解决方案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 无缝地来回包装数据类型所迷惑,我看了很多遍那个小星号却没有发现它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-05
      • 2012-03-04
      • 1970-01-01
      • 1970-01-01
      • 2015-12-31
      相关资源
      最近更新 更多