LINUX.ORG.RU

QTreeView и Drag and Drop: как узнать, над какой веткой произошел Drop?

 


0

1

Делаю возможность 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?????
   // ------------------------------------------------------------------
  }
}
★★★★★

Последнее исправление: Xintrea (всего исправлений: 1)

indexAt(event->pos())
anonymous
()

Просто переопредели в модели:

    virtual bool dropMimeData(const QMimeData *data, Qt::DropAction action,
                              int row, int column, const QModelIndex &parent);
    virtual QMimeData *mimeData(const QModelIndexList &indexes) const;
    virtual QStringList mimeTypes() const;
    virtual Qt::DropActions supportedDropActions() const;

tnodir
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.