Qt如何管理从函数QItemDelegate :: createEditor()返回的Widget指针的内存

时间:2016-03-30 04:55:13

标签: c++ qt pointers qitemdelegate

我正在检查Qt示例Spin Box Delegate示例。在示例中

Year

如何在后期删除指针编辑器?是否由QItemDelegate析构函数完成删除?但是QItemDelegate的析构函数不是虚拟的。任何人都可以帮我解释它是如何工作的?

我不能在QtCreator中添加任何断点。我理解的方式是每次调用虚函数createEditor()时,都会分配一个新的内存中继,并且客户端代码将在函数末尾丢失指针。关于createEditor()的Qt文档没有解释。但我想tableView中的每个单元格都有一个编辑器,是吗?

我真的想知道Qt如何删除那些QWidget指针。

由于

2 个答案:

答案 0 :(得分:3)

在这种情况下,编辑器对象的所有权将传递给createEditor()的调用者。这通常是使用委托进行绘制的QAbstractItemView个实例。每当他们需要编辑器时(例如,因为用户点击了一个单元格),他们就会在委托上调用createEditor(),放置它并显示它。之后,编辑器实例在QAbstractItemView内部进行管理,并在不再使用时删除,或者删除QAbstractItemView本身时删除。甚至可以通过重新实现QAbstractItemDelegate::destroyEditor()来自定义删除(或阻止它)。但这通常没有必要。

这个特殊情况非常具体,它不是像工作中的父/子关系这样的通用Qt机制,而是QAbstractItemView实现中的“手动”代码。如果您想查看详细信息,请搜索“releaseEditor”的qtbase / src / widgets / itemviews。

经常(但不幸的是并非总是)Qt文档提到了所有权。例如。对于QAbstractItemView::setModel(),文档说明:

  

视图不会取得模型的所有权,除非它是模型的父对象,因为模型可以在许多不同的视图之间共享。

对于QItemDelegate :: createEditor(),没有提到任何内容。它应该说“创建的编辑器小部件的所有权传递给调用者”,但也提到destroyEditor()。

答案 1 :(得分:1)

QSpinBoxQObject的子类,它使用所有QObject的父子层次结构(请注意在创建编辑器时如何为编辑器分配编辑器)。有关详细信息,请参阅docs。编辑器将在QWidget传递parent之前删除。它根本不依赖于虚拟析构函数,所以不要担心。它使用元属性(子列表)来执行删除。除了QObject的析构函数 IS 虚拟,所以它的任何子类都会自动拥有虚拟析构函数。

查看delegate doc ditor确实(正如Frank Osterfeld指出的那样)在不再需要时使用destroyEditor方法由代表手动删除(例如,由用户关闭)。