Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Qt如何管理从函数QItemDelegate::createEditor()返回的小部件指针的内存_C++_Qt_Pointers_Qitemdelegate - Fatal编程技术网

C++ Qt如何管理从函数QItemDelegate::createEditor()返回的小部件指针的内存

C++ Qt如何管理从函数QItemDelegate::createEditor()返回的小部件指针的内存,c++,qt,pointers,qitemdelegate,C++,Qt,Pointers,Qitemdelegate,我正在检查Qt示例自旋框代理示例。在这个例子中 QWidget *SpinBoxDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &/* option */, const QModelIndex &/* index */) const { QSpinBox *editor = new QSpinBox(parent); ... return editor;

我正在检查Qt示例自旋框代理示例。在这个例子中

QWidget *SpinBoxDelegate::createEditor(QWidget *parent,
    const QStyleOptionViewItem &/* option */,
    const QModelIndex &/* index */) const
{
    QSpinBox *editor = new QSpinBox(parent);
    ...
    return editor;
}
如何在后期删除指针编辑器?删除是否由QItemDelegate析构函数完成?但是QItemDelegate的析构函数不是虚拟的。谁能帮我解释一下它是怎么工作的

我不能在这个问题上提出任何突破点。我的理解是,每次调用虚拟函数createEditor()时,都会分配一个新的内存主干,客户机代码将丢失函数末尾的指针。关于createEditor()的Qt文档没有解释。但是我想tableView中的每个单元格都会有一个编辑器,对吗

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


感谢
QSpinBox
QObject
的一个子类,它使用所有
QObject
的父子层次结构(请注意在创建编辑器时如何将其指定为父对象)。有关详细信息,请参阅。编辑器将在
QWidget
作为
parent
传递之前被删除。它根本不依赖于虚拟析构函数,所以不用担心。它使用元属性(子列表)执行删除。除此之外,
QObject
的析构函数是虚拟的,因此它的任何子类都自动具有虚拟析构函数


查看编辑器,当不再需要(例如,由用户关闭)时,该编辑器确实(如Frank Osterfeld所指出的)由代表使用
destroyEditor
方法手动删除。

QSpinBox
QObject
的一个子类,它使用所有
QObject
的父子层次结构(请注意在创建编辑器时如何将其指定为父对象)。有关详细信息,请参阅。编辑器将在作为父对象传递之前被删除。它根本不依赖虚拟析构函数,因此不必担心。它使用元属性(子对象列表)执行删除。除此之外,
QObject
的析构函数是虚拟的,因此它的任何子类也自动具有虚拟析构函数


查看编辑器,实际上(正如Frank Osterfeld所指出的),当不再需要时,代理使用
destroyEditor
方法手动删除编辑器(例如,由用户关闭)。

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

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

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

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


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

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

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

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

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

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