gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 20:59:22 29 4
gpt4 key购买 nike

最近我用 Ruby 和 Qt 编写了一个小应用程序。这是我使用 qtruby 的第一个重要项目。一段时间后,我设法将 C++ 引用和教程翻译成可工作的 Ruby 代码,并且掌握了窍门。

仅当在 QTreeView 中实现我自己的拖放功能时小部件,我真的被卡住了。我可以将问题隔离到 Qt::AbstractItemModel::mimeData方法。在消除了一些其他错误后,我最终得到了以下代码,不知何故导致应用程序出现 崩溃 一旦发生拖动 Action 。

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 的实现是 返回指向局部变量的指针 .因此,非确定性崩溃。

一旦找到,解决问题就很容易了。实例变量将保持事件状态并保持其值,直到下一次调用 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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com