1

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

谢谢

4

2 回答 2

5

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

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

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

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

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

于 2016-03-30T06:00:22.927 回答
1

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

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

于 2016-03-30T05:50:06.957 回答