2014-09-19 9 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

+0

попробуйте мое решение. Если я правильно понял, вы испортили использование 'removeItemWidget' и' takeChildren'. Также постарайтесь улучшить вопрос. –

+0

Да, это первое, что я сделал: попробуйте ваше решение. Хорошо, спасибо за совет, попробуй скоро. – MaxNes

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::setItemWidget и QTreeWidget::itemWidget есть комментарий

Примечание: Дерево берет на себя ответственность за виджет.

В моем случае (вставка ребенок между другими родителями и детьми) я реализовал следующее решение:

  1. Implement get_copy() метода для моего виджета
  2. Прежде чем принимать товар от 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)); 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^