您是否需要从QTreeWidget移除removeItemWidget之后删除窗口小部件?

问题描述 投票:1回答:2

我有一个QTreeWidget,其中有两列:一列用于属性名称,一列用于属性值。该值可以通过小部件进行编辑。例如,一个属性是动物。当您双击属性值列时,我通过以下代码制作了一个具有不同动物类型的(自定义)组合框:

QTreeWidgetItemComboBox* comboBox = new QTreeWidgetItemComboBox(treeItem, 1); 
// treeitem is a pointer to the row that is double clicked
comboBox->addItems(QStringList() << "Bird" << "Fish" << "Ape");
ui.treeWidget->setItemWidget(treeItem, 1, comboBox);

[当行失去焦点时,我再次删除小部件(并将值作为QTreeWidgetItem的文本放置)。对于删除,我使用

ui.treeWidget->removeItemWidget(treeItem, 1);

现在,我想知道自从我使用new以来是否也应该再次delete该小部件。我知道例如使用takeChild(i)就是这种情况。但是我没看到itemWidget有类似的东西。

如果我需要删除它,正确的顺序是什么?

QTreeWidgetItemComboBox* comboBox = ui.treeWidget->itemWidget(treeItem,1); 
// Do I need a cast here since the return type is QWidget*
ui.treeWidget->removeItemWidget(treeItem, 1);
delete comboBox;

QTreeWidgetItemComboBox* comboBox = ui.treeWidget->itemWidget(treeItem,1); 
// Do I need a cast here since the return type is QWidget*
delete comboBox;
ui.treeWidget->removeItemWidget(treeItem, 1);

c++ qt qt5 c++17 qtreewidget
2个回答
2
投票

您不可以删除项目小部件,因为树是小部件的所有者,一旦它已通过setItemWidget()传递到树中。

摘自setItemWidget()的文档:

注意:树获得了窗口小部件的所有权。


0
投票

将小部件添加到QTreeWidget后,它的确拥有该小部件的所有权。但是它仅表示在销毁父部件时将删除小部件。

因此,如果您只想在使父QTreeWidget保持活动状态的同时删除小部件,则确实必须手动将其删除。

正确的解决方案是第一个,首先从QTreeWidget中删除小部件,然后使用以下方式之一将其删除:

delete comboBox;
comboBox = nullptr;

或:

comboBox.deleteLater();

首选第二个。

© www.soinside.com 2019 - 2024. All rights reserved.