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

标签 c++ qt pointers qitemdelegate

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

谢谢

最佳答案

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

虽然这个特殊情况非常具体,但它不是像工作中的父/子关系这样的通用 Qt 机制,而是 QAbstractItemView 实现中的“手动”代码。如果您想查看详细信息,请在 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() 没有任何提及。它应该说类似“创建的编辑器小部件的所有权已传递给调用者”,但也提到了 destroyEditor()。

关于c++ - Qt 如何管理从函数 QItemDelegate::createEditor() 返回的 Widget 指针的内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36300003/

相关文章:

c++ - 为什么即使数组衰减为 POINTERS,也可以将函数的参数保留为 ARRAY?

c++ - std::reference_wrapper 与 std::shared_ptrs 并行

c++ - 如何 static_cast 一个指向 const 成员函数的指针?

c++ - 将 Qt 线程与 COM 线程混合

C - 将数组引用传递给函数中的指针参数时遇到问题

转换后的字符串未能包含正确的 float 值

c++ - C++ 中的字符串变量参数列表

c++ - 计算 PI 的值但值未添加到变量

java - 如何使用 Java Android SDK 做好实时数据流

带复制和赋值的 C++ Qt 反射