На этом шаге рассмотрим понятие технологии перетаскивания.
Перетаскивание (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 сведены наиболее часто используемые типы.
Данные собственного приложения, которые не могут интерпретироваться другими программами | |
Звуковые данные, например, audio/wav | |
Растровое изображение, например, image/png | |
Данные моделей, зачастую трехмерные, например, model/vrml | |
Текст, например, text/plain | |
Видеоданные, например, video/mpeg |
В классе QMimeData определены методы для записи данных различных типов:
На все случаи ранее перечисленных методов, естественно, не хватит, т. к. может понадобиться перетаскивать и принимать свои собственные типы данных (например, звуковые данные). Для этих случаев в классе QMimeData определен метод setData(), в который первым параметром нужно передать строку, характеризующую тип данных, а вторым — сами данные в объекте класса QByteArray. Можно поступить и иначе — унаследовать класс QMimeData и перезаписать методы formats() и retrieveData().
Программирование поддержки перетаскивания можно условно разделить на две части: первая часть включает в себя код для перетаскивания объекта (drag), а вторая реализует область приема для сбрасываемых в нее объектов (drop). Также вторая часть должна распознавать, в состоянии ли она принять перетаскиваемый объект или нет. На рис. 1 показан процесс перетаскивания с соответствующими методами возникающих событий.
Рис.1. Процесс перетаскивания и возникающие события
События перетаскивания (drag & drop):
На следующем шаге рассмотрим реализацию первой части перетаскивания - drag.