我有一个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);
您不可以删除项目小部件,因为树是小部件的所有者,一旦它已通过setItemWidget()
传递到树中。
摘自setItemWidget()
的文档:
注意:树获得了窗口小部件的所有权。
将小部件添加到QTreeWidget
后,它的确拥有该小部件的所有权。但是它仅表示在销毁父部件时将删除小部件。
因此,如果您只想在使父QTreeWidget
保持活动状态的同时删除小部件,则确实必须手动将其删除。
正确的解决方案是第一个,首先从QTreeWidget
中删除小部件,然后使用以下方式之一将其删除:
delete comboBox;
comboBox = nullptr;
或:
comboBox.deleteLater();
首选第二个。