如何将子插入QTreeWidget层次结构?

时间:2014-09-19 09:17:27

标签: c++ qt hierarchy qtreewidget qtreewidgetitem

考虑我有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()重新分配小部件后应用程序崩溃。

我的错误是什么?

3 个答案:

答案 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::setItemWidgetQTreeWidget::itemWidget都有评论

  

注意:树取得了小部件的所有权。

在我的情况下(在其他父母和孩子之间插入孩子)我实施了下一个解决方案:

  1. 为我的小部件实施get_copy()方法
  2. QTreeWidget复制链接的小部件
  3. 中取项目之前
  4. 插入新项目并移动旧项目后,将复制的小部件分配给相应的QTreeWidgetItem
  5. 这是一个小例子:

    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);
   }
}