首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Qt/Ruby应用程序在Qt::抽象in::mimeData中崩溃--如何查找和修复原因?

Qt/Ruby应用程序在Qt::抽象in::mimeData中崩溃--如何查找和修复原因?
EN

Stack Overflow用户
提问于 2016-01-13 16:19:57
回答 1查看 108关注 0票数 1

最近,我使用Ruby和Qt编写了一个小应用程序。这是我第一个与qtruby一起做的不平凡的项目。过了一段时间,我成功地将C++引用和教程翻译成了工作的Ruby代码,并掌握了它的窍门。

只有在QTreeView小部件中实现自己的拖放功能时,我才会陷入困境。我可以将问题隔离到Qt::AbstractItemModel::mimeData方法中。在消除了其他一些错误之后,我得到了下面的代码,这些代码在拖动操作发生时就以某种方式导致应用程序崩溃。

代码语言:javascript
运行
复制
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内部发生了崩溃。

,什么是问题,如何解决?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-13 16:19:57

用于C++的mimeData原型是:

代码语言:javascript
运行
复制
QMimeData * QAbstractItemModel::mimeData 
  ( const QModelIndexList & indexes ) const [virtual]

该方法返回指向QMimeData对象的指针。我的mimeData实现是返回指向局部变量的指针。因此,非确定性崩溃。

一旦发现,解决这个问题就很容易了。实例变量将保持活动状态,并将其值保持到mimeData的下一个调用为止。

代码语言:javascript
运行
复制
  @mimeData = Qt::MimeData.new
  @mimeData.setData("application/x-tegi.json", encodedData)
  @mimeData
end

另一种可能是调用super,将构建和解构留给超类。这还继承了默认的mime数据(“application/qabstractitemmodeldatalist”):

代码语言:javascript
运行
复制
  mimeData = super
  mimeData.setData("application/x-tegi.json", encodedData)
  mimeData
end

在发现这个问题之后,对我来说就显得微不足道了。尽管如此,我还是想分享它,因为我浪费了太多的时间在它上。qtruby文档警告指针参数,并提到一些不受支持的函数返回uchar指针,但没有提到返回Qt对象指针的函数。由于被qtruby无缝地来回包装数据类型所吸引,我在那个小星号上看了很多次,却没有发现它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34771752

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档