Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: xintrea от Января 18, 2014, 14:34



Название: QTreeView и Drag and Drop: как узнать, над какой веткой произошел Drop?
Отправлено: xintrea от Января 18, 2014, 14:34
Делаю возможность 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?????
   // ------------------------------------------------------------------
  }
}




Название: Re: QTreeView и Drag and Drop: как узнать, над какой веткой произошел Drop?
Отправлено: kambala от Января 18, 2014, 15:04
в таблице я определяю ячейку (QModelIndex) так: https://github.com/kambala-decapitator/qt-true-dnd-move/blob/master/tableview.cpp#L150

этот метод indexForDragDropEvent() вызывается в dropEvent()


Название: Re: QTreeView и Drag and Drop: как узнать, над какой веткой произошел Drop?
Отправлено: _OLEGator_ от Января 18, 2014, 15:13
А так?
Код
C++ (Qt)
QModelIndex QTreeView::indexAt ( const QPoint & point ) const [virtual]
const QPoint & QDropEvent::pos () const