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

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

本文关键字:返回 createEditor Widget 内存 指针 函数 何管理 管理 Qt QItemDelegate      更新时间:2023-10-16

我正在检查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()时,都会分配一个新的内存主干,并且客户端代码会在函数末尾丢失指针。关于createEditor()的Qt文档没有解释。但我想tableView中的每个单元格都会有一个编辑器,对吗?

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

感谢

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

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

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

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

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

QSpinBoxQObject的一个子类,它使用所有QObject的父子层次结构(请注意,在创建编辑器时如何为其分配父级)。有关详细信息,请参阅文档。编辑器将在QWidget通过之前被删除,就像parent一样。它根本不依赖于虚拟析构函数,所以不用担心。它使用元属性(子列表)来执行删除。除了QObject的析构函数IS是虚拟的,所以它的任何子类都自动具有虚拟析构函数。

查看委托文档,当不再需要时(例如,由用户关闭),委托人确实使用destroyEditor方法手动删除了ditor(正如Frank Osterfeld所指出的)。