Делаю возможность Drop на ветке дерева.
У меня имеется класс KnowTreeView, унаследованный от QTreeView.
В настоящий момент сделал так, чтобы срабатывал переопределенный метод dropEvent() при отпускании перетаскиваемого объекта над веткой дерева.
Теперь вопрос: как узнать, над какой веткой был отпущен перетаскиваемый объект?
Через this->selectionModel() это узнать походу невозможно, так как QItemSelectionModel работает с выделенными элементами. А при отпускании элемент дерева не выделяется (да и не нужно это).
Место, в котором нужно узнать ветку, показано в коде ниже.
#include <QDebug>
#include <QMimeData>
#include "KnowTreeView.h"
#include "libraries/ClipboardRecords.h"
KnowTreeView::KnowTreeView(QWidget *parent) : QTreeView(parent)
{
// Разрешение принимать Drop-события
setAcceptDrops(true);
setDropIndicatorShown(true);
}
KnowTreeView::~KnowTreeView()
{
}
void KnowTreeView::dragEnterEvent(QDragEnterEvent *event)
{
// Проверяется, содержит ли объект переноса данные нужного формата
const QMimeData *mimeData=event->mimeData();
if(mimeData==NULL)
return;
if( ! (mimeData->hasFormat("mytetra/records")) )
return;
QObject *sourceObject=qobject_cast<QObject *>( event->source() );
if( sourceObject->objectName()=="recordview" )
{
event->setDropAction(Qt::MoveAction);
event->accept();
qDebug() << "Accept in dragEnterEvent()";
}
}
void KnowTreeView::dragMoveEvent(QDragMoveEvent *event)
{
// Проверяется, содержит ли объект переноса данные нужного формата
const QMimeData *mimeData=event->mimeData();
if(mimeData==NULL)
return;
if( ! (mimeData->hasFormat("mytetra/records")) )
return;
QObject *sourceObject=qobject_cast<QObject *>( event->source() );
if( sourceObject->objectName()=="recordview" )
{
event->acceptProposedAction();
qDebug() << "Accept in dragMoveEvent()";
}
else
event->ignore();
}
void KnowTreeView::dropEvent(QDropEvent *event)
{
qDebug() << "dropEvent() - Start";
// Проверяется, содержит ли объект переноса данные нужного формата
const QMimeData *mimeData=event->mimeData();
if(mimeData==NULL)
return;
if( ! (mimeData->hasFormat("mytetra/records")) )
return;
QObject *sourceObject=qobject_cast<QObject *>( event->source() );
qDebug() << "dropEvent() - source object name is " << sourceObject->objectName();
if( sourceObject->objectName()=="recordview" )
{
qDebug() << "Try move record by drag and drop";
// Извлечение объекта
const ClipboardRecords *clipboardRecords;
clipboardRecords=qobject_cast<const ClipboardRecords *>(event->mimeData());
// Печать содержимого перетаскиваемого объекта
clipboardRecords->print();
// ------------------------------------------------------------------
// Как узнать, на какой ветке произошел dropEvent?????
// ------------------------------------------------------------------
}
}