4

次の項目階層を持つ QTreeWidget があるとします。

top_item
  |--child

すべてのアイテムにsetItemWidget()ウィジェットが割り当てられています。次のように、最初の 2 つの要素の間に別の子を挿入する必要があります。

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

割り当てられたウィジェットが失われたという 1 つの瞬間を除いて、正常に動作します。子供を連れて行く前に、ウィジェットを取得して保存しようとしました

QWidget* widget_from_child_item = ui->treeWidget->itemWidget(child_item, 0);
ui->treeWidget->removeItemWidget(child_item, 0);

しかし、割り当てられたすべてのウィジェットを呼び出した後、takeChildren()削除され、ウィジェットを で再割り当てした後にアプリがクラッシュしますsetItemWidget()

私の間違いは何ですか?

4

3 に答える 3

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)));
}
于 2014-09-20T10:58:05.373 に答える
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);
   }
}
于 2014-09-19T09:34:51.257 に答える