【问题标题】:How to insert child into QTreeWidget hierarchy?如何将子级插入 QTreeWidget 层次结构?
【发布时间】:2014-11-13 20:17:46
【问题描述】:

考虑我有具有以下项目层次结构的 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() 重新分配小部件后应用程序崩溃。

我的错误是什么?

【问题讨论】:

    标签: c++ qt hierarchy qtreewidget qtreewidgetitem


    【解决方案1】:

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

    注意:树拥有小部件的所有权。

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

    1. 为我的小部件实现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));
      }
    }
    

    【讨论】:

      【解决方案2】:

      做同样事情的另一种方法:

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

      【讨论】:

        【解决方案3】:
        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);
           }
        }
        

        【讨论】:

        • 问题不是如何将孩子插入现有的层次结构,问题是如何保存孩子的小部件。
        • 试试我的解决方案。如果我理解正确,你搞砸了removeItemWidgettakeChildren 的使用。也尝试改进问题。
        • 是的,这是我做的第一件事:尝试您的解决方案。好的,谢谢您的建议,很快就会尝试。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-07-23
        • 1970-01-01
        • 2014-04-20
        • 1970-01-01
        • 1970-01-01
        • 2012-10-05
        • 1970-01-01
        相关资源
        最近更新 更多