Шаг 121.
Библиотека Qt.
События перетаскивания (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 определены методы для записи данных различных типов:

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

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


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

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

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




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