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