События перетаскивания (drag & drop)

   
На этом шаге рассмотрим понятие технологии перетаскивания.

   
Перетаскивание (drag & drop) — это мощная технология обмена данными между приложениями. В настоящее время поддержка перетаскивания является неотъемлемой частью практически любого приложения. Процесс перетаскивания выглядит следующим образом: пользователь нажимает левую кнопку мыши, когда указатель мыши находится на объекте, и, удерживая кнопку, перетаскивает объект из окна одной программы в окно другой. Это позволяет обращаться с виртуальными объектами как с объектами реального мира, перетаскивая их с одного места на другое. Одним из ярких примеров является Recycle Bin (Корзина) на рабочем столе ОС Windows, в которую сбрасывают все удаленные ненужные файлы.

   
Класс QWidget обладает всеми необходимыми методами для поддержки технологии перетаскивания, а некоторые из классов иерархии виджетов содержат ее полную реализацию. Поэтому, прежде чем приступить к реализации перетаскивания, необходимо убедиться в том, что оно не реализовано в виджете. Например, класс QTextEdit предоставляет возможность перетаскивания выделенного текста.

   
Для проведения перетаскивания Qt предоставляет класс QDrag, а для размещения данных различных типов при перетаскивании — класс QMimeData. Обозначение "MIME" означает Multipurpose Internet Mail Extension (многоцелевые расширения почты Интернета). Он предусматривает пересылку текстовых сообщений на различных языках, а также изображений, аудио- и видеоинформации и некоторых других типов данных. К примеру, MIME-тип text/plain означает, что данные представляют собой обычный ASCII-текст, а text/html означает, что данные — это форматированный с помощью языка HTML текст. Для растровых изображений используется тип вида image/*. Например, для файлов с расширением jpg MIME-типом является image/jpg. Если вы используете данные собственного типа, которые могут интерпретироваться только лишь вашим приложением, то тип должен иметь вид application/*. В табл. 1 сведены наиболее часто используемые типы.

Таблица 1. MIME-типы

MIME-типОписание
application/*Данные собственного приложения, которые не могут интерпретироваться другими программами
audio/*Звуковые данные, например, audio/wav
image/*Растровое изображение, например, image/png
model/*Данные моделей, зачастую трехмерные, например, model/vrml
text/*Текст, например, text/plain
video/*Видеоданные, например, video/mpeg

   
В классе QMimeData определены методы для записи данных различных типов:

  • цветовых значений — setColorData();
  • растровых изображений — setImageData();
  • текстовой информации — setText();
  • гипертекстовой информации в формате HTML — setHtml();
  • списков (ссылок) URL (Uniform Resource Locator, единообразный определитель ресурса) — setUrls(). Этот метод часто применяется для перетаскивания файлов.

   
На все случаи ранее перечисленных методов, естественно, не хватит, т. к. может понадобиться перетаскивать и принимать свои собственные типы данных (например, звуковые данные). Для этих случаев в классе QMimeData определен метод setData(), в который первым параметром нужно передать строку, характеризующую тип данных, а вторым — сами данные в объекте класса QByteArray. Можно поступить и иначе — унаследовать класс QMimeData и перезаписать методы formats() и retrieveData().

   
Программирование поддержки перетаскивания можно условно разделить на две части: первая часть включает в себя код для перетаскивания объекта (drag), а вторая реализует область приема для сбрасываемых в нее объектов (drop). Также вторая часть должна распознавать, в состоянии ли она принять перетаскиваемый объект или нет. На рис. 1 показан процесс перетаскивания с соответствующими методами возникающих событий.


Рис.1. Процесс перетаскивания и возникающие события

   
События перетаскивания (drag & drop):

  • класс QDragEnterEvent - унаследован от класса QDragMoveEvent (см. рис. 1 шаг 111). Объект класса содержит данные события перетаскивания. Если пользователь, перетаскивая объект, попадает в область виджета, то вызывается метод dragEnterEvent();
  • класс QDragLeaveEvent - содержит данные события перетаскивания в том случае, если пользователь, перетаскивая объект, выходит за область виджета. При этом вызывается метод dragLeaveEvent();
  • класс QDragMoveEvent - служит для представления данных события перетаскивания в тот момент, когда данные находятся в области виджета. Возникновение этого события приводит к вызову метода dragMoveEvent();
  • класс QDropEvent - объект класса QDropEvent передается в метод dropEvent() при отпускании объекта в принимающей области виджета.

   
На следующем шаге рассмотрим реализацию первой части перетаскивания - drag.

Предыдущий шаг
Содержание
Следующий шаг



Вы можете оставить комментарий, или Трекбэк с вашего сайта.

Оставить комментарий