2014-09-19 60 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)); 
    } 
}