2014-09-19 79 views
2

考虑我有以下项目层次QTreeWidget:如何将孩子插入到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
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); 
    } 
} 
+0

问题不在于如何插入一个孩子到存在的层次,问题是如何挽救孩子的小部件。 – MaxNes 2014-09-19 09:50:22

+0

试试我的解决方案。如果我理解正确,你已经搞乱了'removeItemWidget'和'takeChildren'的用法。也尝试改善问题。 – 2014-09-19 09:56:56

+0

是的,这是我做的第一件事:尝试你的解决方案。好的,谢谢你的建议,很快就会尝试。 – MaxNes 2014-09-19 10:38:38

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

我已经通过Qt文档认识到QWidget实际上并没有连接到QTreeWidgetItem:这两种方法QTreeWidget::setItemWidgetQTreeWidget::itemWidget有评论

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

在我的例子(其他父母和孩子之间插入的孩子),我实现下一个解决方案:

  1. 我的小部件
  2. 实现get_copy()方法采取项目从QTreeWidget复制链接部件之前
  3. 插入新的项目,将旧的项目后,分配复制部件到适当的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)); 
    } 
}