Russian Qt Forum

Qt => Model-View (MV) => Тема начата: sergs от Январь 22, 2016, 13:53



Название: Нестандартный drag and drop
Отправлено: sergs от Январь 22, 2016, 13:53
Есть модель, основаная на QAbstractItemModel. В ней помимо прочего переопределены методы mimeData(), mimeTypes(), dropMimeData() и supportedDropActions(). Причем supportedDropActions() возвращает только Qt::MoveAction. Также есть класс представления, основанный на QTreeView в котором отображаются данные модели.

Сейчас при помощи drag and drop можно выполнять перетаскивание элементов внутри view (менять их порядок, перегруппировывать). Но при перетаскивании элемента в другой view выполняется перемещение. Необходимо реализовать следующее поведение: при перетаскиевании в пределах одного view всегда выполняется перемещение (Qt::MoveAction), а при перетаскивании за пределы view должна быть возможность выполнить либо клопирование, либо перемещение.

Попытался реализовать это путём добавления Qt::CopyAction в список разрешенных
Код:
 Qt::DropActions MyTreeModel::supportedDropActions() const
 {
  return Qt::CopyAction | Qt::MoveAction;
 }
и переопределением метод dropEvent() у класса представления
Код:
void MyTreeView::dropEvent(QDropEvent *event)
{
  if ( event->source() == this && event->proposedAction() == Qt::CopyAction)
  {
     event->setDropAction(Qt::MoveAction);
  }
  event->accept();
  QTreeView::dropEvent(event);
}
Но ничего не получилось. При перетаскивании даже в пределах одного view элемент просто удаляется. Подскажите в чем моя ошибка и как можно реализовать желаемое поведение?


Название: Re: Нестандартный drag and drop
Отправлено: YvenTitan от Январь 22, 2016, 14:25
Можете скинуть переопределенную DropMimeData и строки, где устанавливаете параметры QTreeView для drag and drop