考虑我有QTreeWidget以及以下项目层次结构:
top_item
|--child
每个项目都分配了setItemWidget()
小部件。
我需要在我的前两个元素之间插入另一个孩子,如下所示:
top_item
|--another_child
|--child
我尝试使用以下代码执行此操作:
QTreeWidgetItem* top_item = new QTreeWidgetItem;
ui->treeWidget->addTopLevelItem(top_item);
QTreeWidgetItem* child_item = new QTreeWidgetItem;
top_item->addChild(child_item);
ui->treeWidget->setItemWidget(top_item, 0, new QPushButton);
ui->treeWidget->setItemWidget(child_item, 0, new QPushButton);
// ---- let's insert another child ----
auto last_children = top_item->takeChildren();
QTreeWidgetItem* another_child_item = new QTreeWidgetItem;
top_item->insertChild(0, another_child_item);
ui->treeWidget->setItemWidget(another_child_item, 0, new QPushButton);
another_child_item->addChildren(last_children);
除了片刻之外它工作正常 - 它丢失了分配的小部件。 在带孩子之前,我试图拍摄并保存小部件
QWidget* widget_from_child_item = ui->treeWidget->itemWidget(child_item, 0);
ui->treeWidget->removeItemWidget(child_item, 0);
但在调用takeChildren()
之后,所有已分配的小部件都已删除,并且在使用setItemWidget()
重新分配小部件后应用程序崩溃。
我的错误是什么?
答案 0 :(得分:1)
另一种做同样事情的方法:
QTreeWidgetItem *child = ui->treeWidget->currentItem();
QTreeWidgetItem *parent = child->parent();
if(parent)
{
QTreeWidgetItem *another_child = new QTreeWidgetItem();
another_child->setText(0,"another_child");
parent->addChild(another_child);
another_child->addChild(parent->takeChild(parent->indexOfChild(child)));
}
答案 1 :(得分:1)
我已经通过Qt文档认识到QWidget
实际上并未与QTreeWidgetItem
相关联:方法QTreeWidget::setItemWidget
和QTreeWidget::itemWidget
都有评论
注意:树取得了小部件的所有权。
在我的情况下(在其他父母和孩子之间插入孩子)我实施了下一个解决方案:
get_copy()
方法QTreeWidget
复制链接的小部件QTreeWidgetItem
这是一个小例子:
void insert_tree_item(i_tree_item* new_widget_item)
{
QTreeWidgetItem* current_item = _tree_widget->currentItem();
if(current_item->childCount())
{
QList<QWidget*> widgets;
widgets.push_front(dynamic_cast<QWidget*>(new_widget_item));
QTreeWidgetItem* ptr = current_item->child(0);
while(ptr != nullptr)
{
QWidget* widget = _tree_widget->itemWidget(ptr, 0);
widgets.push_back(dynamic_cast<i_tree_item*>(widget)->get_copy());
auto prev_ptr = ptr;
ptr = ptr->child(0);
if(ptr == nullptr)
{
prev_ptr->addChild(new QTreeWidgetItem);
}
}
ptr = current_item->child(0);
while(widgets.count() != 0)
{
_tree_widget->setItemWidget(ptr, 0, widgets.takeFirst());
ptr = ptr->child(0);
}
}
else
{
QTreeWidgetItem* new_item = new QTreeWidgetItem;
current_item->addChild(new_item);
_tree_widget->setItemWidget(new_item, 0, dynamic_cast<QWidget*>(new_widget_item));
}
}
答案 2 :(得分:0)
void insertAParent() {
if (tree->selectedItems().count() != 1)
return;
QTreeWidgetItem *item = tree->selectedItems().front();
QTreeWidgetItem *oldParent = item->parent();
if (oldParent) {
int index = oldParent->indexOfChild(item);
item = oldParent->takeChild(index);
QTreeWidgetItem *newParent = new QTreeWidgetItem;
newParent->setText(0, tr("Something"));
oldParent->insertChild(index, newParent);
newParent->insertChild(0, item);
}
}