我正在检查 Qt 示例 Spin Box Delegate 示例。在例子中
QWidget *SpinBoxDelegate::createEditor(QWidget *parent,
const QStyleOptionViewItem &/* option */,
const QModelIndex &/* index */) const
{
QSpinBox *editor = new QSpinBox(parent);
...
return editor;
}
指针编辑器后期怎么删除的?删除是由 QItemDelegate 析构函数完成的吗?但是 QItemDelegate 的析构函数不是虚的。谁能帮我解释一下它是如何工作的?
我不能在 QtCreator 中放置任何断点。我的理解是每次调用虚拟函数 createEditor() 时,都会分配一个新的内存主干,客户端代码将在函数末尾丢失指针。 Qt文档关于createEditor()没有解释。但我想 tableView 中的每个单元格都会有一个编辑器,对吗?
我真的很想知道 Qt 是如何删除那些 QWidget 指针的。
谢谢
最佳答案
在这种情况下,编辑器对象的所有权被传递给 createEditor() 的调用者。这通常是 QAbstractItemView使用委托(delegate)进行绘画的实例。每当他们需要编辑器时(例如,因为用户单击了一个单元格),他们就会在委托(delegate)上调用 createEditor() ,放置并显示它。之后,编辑器实例在 QAbstractItemView 中进行内部管理,并在不再使用或 QAbstractItemView 本身被删除时删除。甚至可以通过重新实现 QAbstractItemDelegate::destroyEditor() 来自定义删除(或阻止删除) .不过这通常不是必需的。
虽然这个特殊情况非常具体,但它不是像工作中的父/子关系这样的通用 Qt 机制,而是 QAbstractItemView 实现中的“手动”代码。如果您想查看详细信息,请在 qtbase/src/widgets/itemviews 中搜索“releaseEditor”。
Qt 文档经常(但遗憾的是并不总是)提到所有权。例如。对于 QAbstractItemView::setModel() ,文档指出:
The view does not take ownership of the model unless it is the model's parent object because the model may be shared between many different views.
对于 QItemDelegate::createEditor() 没有任何提及。它应该说类似“创建的编辑器小部件的所有权已传递给调用者”,但也提到了 destroyEditor()。
关于c++ - Qt 如何管理从函数 QItemDelegate::createEditor() 返回的 Widget 指针的内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36300003/