На этом шаге рассмотрим понятие технологии перетаскивания.
Перетаскивание (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.
Предыдущий шаг
Содержание
Следующий шаг