На этом шаге рассмотрим реализацию drop.
На рис. 1 показан виджет, способный принимать сбрасываемые в него объекты (в данном случае — файлы). После сбрасывания виджет отображает полное имя файла.

Рис.1. Виджет, принимающий сбрасываемые объекты
Ниже представлено определение класса Drag:
class Drop : public QLabel {
Q_OBJECT
protected:
//Метод dragEnterEvent() вызывается каждый раз, когда перетаскиваемые объекты
//пересекают границу виджета. В этом методе виджет сообщает о готовности
//или неготовности принимать перетаскиваемые объекты, при этом указатель мыши
//из перечеркнутого круга превращается в стрелку с прямоугольником,
//в противном случае внешний вид указателя остается без изменений
virtual void dragEnterEvent(QDragEnterEvent* pe)
{
//С помощью метода hasFormat() необходимо проверять на совместимость
//тип данных перетаскиваемых объектов
if (pe->mimeData()->hasFormat("text/uri-list")) {
//Вызов метода acceptProposedAction() объекта события QDragEnterEvent
//сообщает о готовности виджета принять перетаскиваемый объект
pe->acceptProposedAction();
}
}
//Метод dropEvent() вызывается при сбрасывании перетаскиваемых объектов
//в пределах окна виджета, что происходит в момент отпускания левой кнопки мыши
virtual void dropEvent(QDropEvent* pe)
{
//Вызов метода urls() объекта класса QMimeData возвращает
//список файлов в переменную urlList
QList<QUrl> urlList = pe->mimeData()->urls();
QString str;
foreach(QUrl url, urlList) {
//В цикле foreach вызовом метода QUrl::toString() извлекаются строки,
//которые объединяются в одну
str +="<font color=blue size=3><b>"+ url.toString() + "</b></font><br>";
}
//Полученная строка отображается методом setText()
setText("<Font color=green size=3>Принято:</font><br>" + str);
}
public:
Drop(QWidget* pwgt = 0) : QLabel("<font color=red size=10><b>Бросай сюда
</b></font>", pwgt)
{
//В конструкторе класса Drop осуществляется вызов метода setAcceptDrops(),
//в который передается значение true, для того чтобы виджет был в состоянии
//принимать сбрасываемые объекты
setAcceptDrops(true);
}
};Файлы приложения можно взять здесь.
Класс QDragEnterEvent унаследован от класса QDragMoveEvent (см. рис. 1 шаг 111). Этот класс предоставляет методы accept() и ignore(), которыми можно воспользоваться для разрешения (или запрета) приема перетаскиваемых объектов. В эти методы можно передавать объекты класса QRect. С их помощью можно ограничить размеры принимающей области в самом виджете. Чтобы разрешить, например, сбрасывание объектов во всей области виджета, можно сделать следующий вызов: accept(rect()).
На следующем шаге рассмотрим создание собственных типов перетаскивания.