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 是子指针。
我正在尝试为 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 是子指针。