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

How Qt manage the memory of an Widget pointer which is returned from the function QItemDelegate::createEditor()

我正在检查 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 指针的。

谢谢

QSpinBoxQObject 的子 class 并且它使用所有 QObject 的父子层次结构(注意您如何为编辑器分配父级创建时)。有关详细信息,请参阅 docs。编辑器将在 QWidget 通过之前被删除,因为 parent 将会。它根本不依赖虚拟析构函数,所以不用担心。它使用元属性(子列表)来执行删除。除了 QObject 的析构函数 虚拟的,所以它的任何子 class 也自动具有虚拟析构函数。

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

在这种情况下,编辑器对象的所有权被传递给 createEditor() 的调用者。这通常是 QAbstractItemView instance(s) using the delegate for painting. Whenever they need an editor (e.g. because the user clicked into a cell), they call createEditor() on the delegate, place it and show it. Afterwards the editor instances are managed internally in QAbstractItemView and deleted when not used anymore, or when the QAbstractItemView itself is deleted. One can even customise the deletion (or prevent it) by reimplementing QAbstractItemDelegate::destroyEditor()。不过这通常不是必需的。

这个特殊情况非常具体,它不是像工作中的 parent/child 关系那样的通用 Qt 机制,而是 QAbstractItemView 实现中的 "manual" 代码。如果您想查看详细信息,请在 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() 没有提及任何内容。它应该说类似 "The ownership for the created editor widget is passed to the caller" 但也提到 destroyEditor().