Qt/Ruby Qt::AbstractItemModel::mimeData 中的应用程序崩溃 - 如何找到并修复原因?
Qt/Ruby Application Crash in Qt::AbstractItemModel::mimeData - How to find and fix the cause?
最近我使用 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++ 原型是:
QMimeData * QAbstractItemModel::mimeData
( const QModelIndexList & indexes ) const [virtual]
方法 returns 一个指向 QMimeData
对象的指针。我对 mimeData
的实现是 返回一个指向局部变量的指针 。因此 non-deterministic 崩溃了。
一旦找到,解决问题就很容易了。实例变量将保持活动状态并保持其值直到下一次调用 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 无缝地来回包装数据类型所迷惑,我在那个小星号上看了很多遍都没有发现它。
最近我使用 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++ 原型是:
QMimeData * QAbstractItemModel::mimeData
( const QModelIndexList & indexes ) const [virtual]
方法 returns 一个指向 QMimeData
对象的指针。我对 mimeData
的实现是 返回一个指向局部变量的指针 。因此 non-deterministic 崩溃了。
一旦找到,解决问题就很容易了。实例变量将保持活动状态并保持其值直到下一次调用 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 无缝地来回包装数据类型所迷惑,我在那个小星号上看了很多遍都没有发现它。