2015-11-03 3 views
1

i'am пытается установить новый родителю QTreeWidgetItem, вот мой код:QTreeWidgetItem reparenting

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.

EDITED

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

Тот же результат.

+0

Отладчик, такой как GDB, скажет вам, что является нулевым и что не удалось. – Mezzo

+0

Ничего нет, это проблема. он, под и родитель отлично работает, пока не возьмет или не удалит ребенка из родителя. –

ответ

0

попробуйте этот код:

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

в основном используют removeChild InstEd из takeChild

UPDATE
removeChild Удаляет заданный элемент из родительского и dosen't вернуть anyting. обратите внимание, что удаленный элемент не будет удален. но takeChild возвращает дочерний указатель.

+0

Нет, такая же ошибка. –

+0

«parent» - это QTreeWidget * (не QTreeWidgetItem *), но это не должно быть проблемой. Если у вас все еще есть проблемы с этими несколькими строками, я полагаю, что ошибка находится где-то в другом месте, а не в том, что вы показали. – Mezzo

+0

Как «родителем» может быть QTreeWidget? Согласно qt-help QTreeWidgetItem :: parent() возвращает QTreeWidgetItem *. Это может быть так, только если QTreeWidget наследуется от QTreeWidgetItem. –