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()时,都会分配一个新的内存主干,并且客户端代码会在函数末尾丢失指针。关于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()。
QSpinBox
是QObject
的一个子类,它使用所有QObject
的父子层次结构(请注意,在创建编辑器时如何为其分配父级)。有关详细信息,请参阅文档。编辑器将在QWidget
通过之前被删除,就像parent
一样。它根本不依赖于虚拟析构函数,所以不用担心。它使用元属性(子列表)来执行删除。除了QObject
的析构函数IS是虚拟的,所以它的任何子类都自动具有虚拟析构函数。
查看委托文档,当不再需要时(例如,由用户关闭),委托人确实使用destroyEditor
方法手动删除了ditor(正如Frank Osterfeld所指出的)。
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- 什么时候在C++中返回常量引用是个好主意
- 你能重载对象变量名本身返回的内容吗
- 为什么 Serial.println(<char[]>);返回随机字符?
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 如何获取std::result_of函数的返回类型
- QueryWorkingSet总是返回false
- (C++)分析树以计算返回错误值的简单算术表达式
- 访问者访问变体并返回不同类型时出错
- 如何返回一个类的两个对象相加的结果
- OpenInventor从9.8升级到10.4.2后,GLSL纹理返回零
- lower_bound()返回最后一个元素
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- 奇怪的(对我来说)返回声明 - 在谷歌上找不到任何关于它的信息
- 如何取消对nullptr的屏蔽,返回正确的对象
- 奇怪的结构&GCC&clang(void*返回类型)
- 架构决策:返回std::future还是提供回调
- 从python中调用C++函数并获取返回值
- 矩阵向量乘法(cublasDgemv)返回零
- Qt如何管理从函数QItemDelegate::createEditor()返回的Widget指针的内存