crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
xintrea
  опции профиля:
сообщение 18.1.2014, 14:47
Сообщение #1


Студент
*

Группа: Новичок
Сообщений: 15
Регистрация: 20.5.2008
Пользователь №: 179

Спасибо сказали: 1 раз(а)




Репутация:   0  


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



Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
crot26rus
  опции профиля:
сообщение 19.1.2014, 15:13
Сообщение #2


Новичок


Группа: Новичок
Сообщений: 9
Регистрация: 4.4.2010
Пользователь №: 1593

Спасибо сказали: 5 раз(а)




Репутация:   0  


Если ты используешь QTreeView, значит есть модель, а у модели есть метод
virtual bool dropMimeData(const QMimeData * data, Qt::DropAction action, int row, int column, const QModelIndex & parent)

он как раз и позволит определить, куда делается дроп.

Также в модели есть
virtual QStringList mimeTypes() const

который возвращает поддерживаемые моделью mime types. Он должен возвращать твой mine type, чтобы вызывался dropMimeData.

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 28.4.2025, 14:05