QTreeWidgetItem 重新设置父级

QTreeWidgetItem reparenting

我正在尝试为 QTreeWidgetItem 设置新父级,这是我的代码:

 1.if( it->parent() )//'it' is QTreeWidgetItem
 2.   {
 3.       QTreeWidgetItem* parent = it->parent();
 4.       parent->takeChild(parent->indexOfChild(it));
 5.   }
 7.   under->addChild( it );//'under' is new parent of 'it'

第四行程序失败后 read access violation at 0x0

已编辑

    Q_CHECK_PTR(under);
    Q_CHECK_PTR(it);

    if( it->parent() )
    {
        QTreeWidgetItem* parent = it->parent();

        Q_CHECK_PTR(parent);

        Q_ASSERT( parent->child( parent->indexOfChild(it) ) == it );

        parent->removeChild(it);
        //or
        //it = new QTreeWidgetItem( *(parent->takeChild(parent->indexOfChild(it))) );
        //or
        //it = parent->takeChild(parent->indexOfChild(it));
        //or
        //parent->takeChild(parent->indexOfChild(it));
    }
    Q_CHECK_PTR(under);
    Q_CHECK_PTR(it);
    under->addChild( it );

同样的结果。

试试这个代码:

QTreeWidgetItem *parent = it->parent();
parent->removeChild(it);
under->addChild(it);  

基本上使用 removeChild 代替 takeChild

更新
removeChild 从父级中删除给定的项目并且不 return 任何东西。请注意,已删除的项目不会被删除。但是 takeChild return 是子指针。