Технология drag & drop

Технология drag & drop позволяет обмениваться данными различных типов между компонентами как одного приложения, так и разных приложений, путем перетаскивания и сбрасывания объектов с помощью мыши. Типичным примером использования технологии служит перемещение файлов в программе Проводник в Windows. Чтобы переместить файл в другой каталог достаточно нажать левую кнопку мыши над значком файла и, не отпуская кнопку, перетащить файл на значок каталога, а затем отпустить кнопку мыши. Если необходимо скопировать файл, а не переместить, то следует дополнительно удерживать нажатой клавишу <Ctrl>.

Запуск перетаскивания

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

  • внутри метода mousePressEvent() запоминаются координаты щелчка левой кнопкой мыши;
  • внутри метода mouseMoveEvent() вычисляется пройденное расстояние или измеряется время операции. Это необходимо сделать, чтобы предотвратить случайное перетаскивание. Управлять задержкой позволяют следующие статические методы класса QApplication:
  • startDragDistance() — возвращает минимальное расстояние, после прохождения которого можно запускать операцию перетаскивания;
  • setStartDragDistance() — задает расстояние;
  • startDragTime() — возвращает время задержки в миллисекундах перед запуском операции перетаскивания;
  • setStartDragTime() — задает время задержки;

Прототипы методов:

static int startDragDistance()
static void setStartDragDistance(int l)
static int startDragTime()
static void setStartDragTime(int ms)
  • если пройдено минимальное расстояние или истек минимальный промежуток времени, то создается экземпляр класса QDrag и вызывается метод exec(), который после завершения операции возвращает действие, выполненное с данными (например, данные скопированы или перемещены).

Создать экземпляр класса QDrag можно так:

QDrag *drag = new QDrag(this);

Класс QDrag содержит следующие методы:

  • exec() — запускает процесс перетаскивания и возвращает действие, которое было выполнено по завершении операции. Прототипы метода:
Qt::DropAction exec(
               Qt::DropActions supportedActions = Qt::MoveAction)
Qt::DropAction exec(Qt::DropActions supportedActions,
                    Qt::DropAction defaultDropAction)

В параметре supportedActions указывается комбинация допустимых действий, а в параметре defaultDropAction — действие, которое используется, если не нажаты клавиши-модификаторы. Возможные действия могут быть заданы следующими константами: Qt::CopyAction (копирование), Qt::MoveAction (перемещение), Qt::LinkAction (ссылка), Qt::IgnoreAction (действие проигнорировано), Qt::TargetMoveAction. Пример:

Qt::DropAction action = drag->exec(
               Qt::MoveAction | Qt::CopyAction, Qt::MoveAction);
  • setMimeData() — позволяет задать перемещаемые данные. В качестве значения указывается экземпляр класса QMimeData. Прототип метода:
void setMimeData(QMimeData *data)

Пример передачи текста:

QMimeData *data = new QMimeData();
data->setText("Перетаскиваемый текст");
QDrag *drag = new QDrag(this);
drag->setMimeData(data);
  • mimeData() — возвращает указатель на экземпляр класса QMimeData с перемещаемыми данными. Прототип метода:
QMimeData *mimeData() const
  • setPixmap() — задает изображение, которое будет перемещаться вместе с указателем мыши. В качестве параметра указывается экземпляр класса QPixmap. Прототип метода:
void setPixmap(const QPixmap &pixmap)

Пример:

drag->setPixmap(
            QPixmap("C:\\cpp\\projectsQt\\Test\\pixmap.png"));
  • pixmap() — возвращает экземпляр класса QPixmap с изображением, которое перемещается вместе с указателем. Прототип метода:
QPixmap pixmap() const
  • setHotSpot() — задает координаты "горячей" точки на перемещаемом изображении. В качестве параметра указывается экземпляр класса QPoint. Прототип метода:
void setHotSpot(const QPoint &hotspot)

Пример:

drag->setHotSpot(QPoint(40, 40));
  • hotSpot() — возвращает экземпляр класса QPoint с координатами "горячей" точки на перемещаемом изображении. Прототип метода:
QPoint hotSpot() const
  • setDragCursor() — позволяет изменить внешний вид указателя мыши для действия, указанного во втором параметре. Прототип метода:
void setDragCursor(const QPixmap &cursor, Qt::DropAction action)

В первом параметре указывается экземпляр класса QPixmap, а во втором параметре — константы Qt::CopyAction, Qt::MoveAction или Qt::LinkAction. Пример изменения указателя для перемещения:

drag->setDragCursor(
         QPixmap("C:\\cpp\\projectsQt\\Test\\cursor.png"),
         Qt::MoveAction);
  • source() — возвращает указатель на компонент-источник. Прототип метода:
QObject *source() const
  • target() — возвращает указатель на компонент-приемник или нулевой указатель, если компонент находится в другом приложении. Прототип метода:
QObject *target() const

Класс QDrag поддерживает два сигнала:

  • actionChanged(Qt::DropAction) — генерируется при изменении действия;
  • targetChanged(QObject*) — генерируется при изменении принимающего компонента.

Пример назначения обработчика сигнала actionChanged():

connect(drag, SIGNAL(actionChanged(Qt::DropAction)),
        this, SLOT(on_action_changed(Qt::DropAction)));

Учебник C++ (Qt Creator и MinGW)
Учебник C++ (Qt Creator и MinGW) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов