Есть модель, основаная на 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 элемент просто удаляется. Подскажите в чем моя ошибка и как можно реализовать желаемое поведение?