Qt Drag and Drop - Изменить отображение изображения при перетаскивании - PullRequest
6 голосов
/ 12 октября 2011

Я начал перетаскивание с изображением.

QDrag* drag = new(QDrag)(this);
drag->setPixmap(*pixmap);
drag->exec(Qt::CopyAction | Qt::MoveAction);

Я хочу изменить отображение изображения, когда мое перетаскивание достигнет определенной точки в виджете.

В настоящее время у меня есть идея.После того, как я начинаю первое перетаскивание, когда мое перетаскивание достигает определенной точки, я отменяю первое перетаскивание, а затем возобновляю новое перетаскивание с новым изображением.

Я делаю это в dragMoveEvent.Я могу начать новое перетаскивание с новым изображением.Но я, кажется, не могу отменить первое перетаскивание.Я обнаружил, что предыдущее действие перетаскивания все еще выполняется.

Любой может предложить:

if (event->mimeData()->hasText())
{
  if (need_to_change_pixmap())
  {
    event->setDropAction(Qt::IgnoreAction);
    change_pixmap_restart_drag();
  }
  else
  {
    event->setDropAction(Qt::MoveAction);
    event->accept();
  }
}
else
{
  event->ignore();
}

Функция change_pixmap_restart_drag просто начинает перетаскивание.

Ответы [ 2 ]

6 голосов
/ 15 октября 2011

Согласно документации Qt , вы не можете изменить растровое изображение после начала перетаскивания.

Qt использует:

  • безрамные окна, которые следуют за мышью на X11 . Растровое изображение отображается на виджете, а setGrabMouse используется для получения событий мыши, поскольку виджет не находится непосредственно под мышью.
  • функция SetCursor в Windows с копией растрового изображения, в котором курсоры для каждого действия нарисованы в углу.
  • функция SetDragImageWithCGImage на Mac , но для нее необходим объект DragRef, который объявлен как недоступная локальная переменная в qdnd_mac.mm .

Вы можете попробовать использовать метод X11 на всех платформах или использовать SetCursor, если вы планируете развертывать приложение только в Windows.

0 голосов
/ 07 декабря 2011

Из документов QDrag:

void QDrag::setPixmap ( const QPixmap & pixmap ) :

Устанавливает pixmap в качестве pixmap, используемого для представления данных в операции перетаскивания.Вы можете установить pixmap только до начала перетаскивания.

Итак, извините, но вы не можете!Четный setDragCursor() - это метод без эффектов ...

...