Название: TreeView AbstractItemModel и перемещение ветки Отправлено: Boris от Сентябрь 23, 2009, 15:43 Делаю все как в qt\examples\itemviews\editabletreemodel, но нужно реализовать перемещение веток(с дочерними) вместе. Любой ценой можно с драгдроп можно без. По форуму листал не помогло. Прошу помочь советом.
Особо интересует как отрехтовать класс TreeItem чтобы в нем можно было двигать ветки. Название: Re: TreeView AbstractItemModel и перемещение ветки Отправлено: Vass от Сентябрь 23, 2009, 16:25 Если в кратце то вот то получается, 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 Далее Вы осуществляете разбор данных и соответственно из них извлекаете информацию о том что дропнули, Когда у вас есть инфа, что дропнули и есть инфа куда дропнули, Вы смело можете переносить это путем переноса указателя на чилда из листа старого родителя в лист нового Название: Re: TreeView AbstractItemModel и перемещение ветки Отправлено: Boris от Сентябрь 23, 2009, 16:48 Спасибо я это и пробую... что-то у меня не работает.
TreeItem один в один как в примере за исключением. Код я тут на форуме позаимствовал Код: bool TreeItem::Move(int to, TreeItem *item) Код: bool TreeModel::dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent) Когда перетаскиваешь не обновляется TreeView (на месте откуда перетащил пелая строка остается) Если у TreeItem есть скажем два дочерних итема и хочешь скинуть верхний во второй (те чтобы верхний дочерний стал дочерним второго дочернего) вываливается error. Такой вопрос здесь уже задавался его так и не решили. примеров я не нашел. Название: Re: TreeView AbstractItemModel и перемещение ветки Отправлено: Vass от Сентябрь 23, 2009, 17:14 Так обновляете модель то, после того как перенесли, например так:
Код: emit layoutChanged(); ------------------------------------ А поповоду ошибок, ищите, где-то указатель теряется, кстати вот здесь: Код: item->childItems.insert(item->childItems.size(),this); И удалять рекомендовал бы через Код: removeOne(TreeItem* ); Название: Re: TreeView AbstractItemModel и перемещение ветки Отправлено: Boris от Сентябрь 24, 2009, 07:54 Спасибо, но все равно не то. Если ветку перетягиваешь в другие более нижние ветки, то она просто пропадает
И еще такой вопрос в dropMimeData возвращаю false, а в treeView все равно происходит перетаскивание. Да и еще там insertRows/removeRows отрабатывают, так когда вниз тянешь insertRows не отрабатывает а ремов делает свое дело |