Пытаюсь сейчас разобраться с технологией Drag and Drop в Qt.
Проблема в том, что в принимающем виджете (унаследованном от QTreeView) событие dragEnterEvent() вызывается нормально, а событие dropEvent() - не вызывается.
Я разрешил виджету принимать Drop-события:
KnowTreeView::KnowTreeView(QWidget *parent) : QTreeView(parent)
{
// Разрешение принимать Drop-события
setAcceptDrops(true);
setDropIndicatorShown(true);
}
Однако курсор при перетаскивании на этот виджет все равно в виде запрещающего знака.
Реализация dragEnterEvent(), который срабатывает:
void KnowTreeView::dragEnterEvent(QDragEnterEvent *event)
{
qDebug() << "dragEnterEvent() - Start";
// Проверяется, содержит ли объект переноса данные нужного формата
const QMimeData *mimeData=event->mimeData();
if(mimeData==NULL)
{
qDebug() << "dragEnterEvent() - mime data is NULL";
return;
}
if( ! (mimeData->hasFormat("mytetra/records")) )
{
qDebug() << "dragEnterEvent() - format not have mytetra records";
return;
}
QObject *sourceObject=qobject_cast<QObject *>( event->source() );
if( sourceObject->objectName()=="recordview" )
{
event->setDropAction(Qt::MoveAction);
event->accept();
// event->acceptProposedAction();
qDebug() << "Accept in dragEnterEvent()";
}
}
Реализация dropEvent() - считайте что просто один дебаговый вывод в консоль. И этого вывода нет.
В чем может быть причина?Полная реализация программы:
https://github.com/xintrea/mytetra_dev - ветка experimental
Проблемный файл с виджетом - приемником: ./src/views/tree/KnowTreeView.cpp
Файл с виджетом - источником: /src/views/recordTable/RecordListScreen.cpp
Предполагается перетаскивание записи (верхняя правая область) на ветку дерева (левая область).