Russian Qt Forum
Июля 08, 2025, 00:17 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Drag and Drop: не вызывается dropEvent()  (Прочитано 3437 раз)
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« : Января 17, 2014, 23:03 »

Пытаюсь сейчас разобраться с технологией 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

Предполагается перетаскивание записи (верхняя правая область) на ветку дерева (левая область).
Записан

Собираю информацию по крупицам
http://webhamster.ru
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #1 : Января 17, 2014, 23:38 »

кажется надо еще dragMoveEvent() переопределять и если событие драга тебе подходит, то в нем надо вызывать event->acceptProposedAction(), иначе event->ignore().

еще попробуй добавить вызов setDragDropMode(QAbstractItemView::DragDrop);

на всякий случай вот репозиторий, где я игрался с ДнД (там таблица, а не дерево): https://github.com/kambala-decapitator/qt-true-dnd-move
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« Ответ #2 : Января 18, 2014, 14:18 »

кажется надо еще dragMoveEvent() переопределять и если событие драга тебе подходит, то в нем надо вызывать event->acceptProposedAction(), иначе event->ignore()

Этого оказалось достаточно, спасибо.
Записан

Собираю информацию по крупицам
http://webhamster.ru
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.278 секунд. Запросов: 23.