Если в кратце то вот то получается, TreeItem у вас содержит лист чилдов, т.е по идее чтобы переместить ветку вам надо, из одного листа удалить чилда, а в другой добавить.
virtual bool dropMimeData ( const QMimeData * data, Qt::DropAction action, int row, int column, const QModelIndex & parent )
он вызывается когда что-то куда-то дропиться.
parent - это индекс элемента на которой дропнули.
data - это то что дропнули, формат данных в data Вы можете определить сами переопределив функцию:
virtual QMimeData * mimeData ( const QModelIndexList & indexes ) const
Далее Вы осуществляете разбор данных и соответственно из них извлекаете информацию о том что дропнули,
Когда у вас есть инфа, что дропнули и есть инфа куда дропнули, Вы смело можете переносить это путем переноса указателя на чилда из листа старого родителя в лист нового