Шаг 72.
Библиотека PyQt5.
Обработка сигналов и событий. Технология drag & drop. Запуск перетаскивания
На этом шаге мы рассмотрим алгоритм реализации перетаскивания, а также классы и методы, его поддерживающие.
Операция перетаскивания состоит из двух частей: первая часть запускает процесс, а вторая обрабатывает момент сброса объекта. Обе части могут обрабатываться, как одним, так и двумя разными
приложениями. Запуск перетаскивания осуществляется следующим образом:
- Внутри метода mousePressEvent() запоминаются координаты указателя мыши в момент щелчка ее левой кнопкой.
- Внутри метода mouseMoveEvent() вычисляется пройденное расстояние или измеряется время операции. Это необходимо для того, чтобы предотвратить случайное перетаскивание.
Управлять задержкой позволяют следующие статические методы класса QApplication:
- setStartDragDistance (<Дистанция>) - задает минимальное расстояние, после прохождения которого будет запущена операция перетаскивания;
- startDragDistance () - возвращает это расстояние;
- setStartDragTime (<Время>) - задает время задержки в миллисекундах перед запуском операции перетаскивания;
- startDragTime () - возвращает это время.
- Если пройдено минимальное расстояние или истек минимальный промежуток времени, создается экземпляр класса QDrag, и у него вызывается метод ехес(), который после
завершения операции возвращает действие, выполненное с данными (например, их копирование или перемещение).
Создать экземпляр класса QDrag можно так:
<Объект> = QtGui.QDrag (<Ссылка на компонент>)
Класс QDrag поддерживает следующие методы:
- exec () - запускает процесс перетаскивания и возвращает действие, которое было выполнено по завершении операции. Метод имеет два формата:
exec ([<Действия> = MoveAction] )
exec (<Действия>, <Действие по умолчанию>)
В параметре Действия указывается комбинация допустимых действий, а в параметре Действие по умолчанию - действие, которое используется, если в процессе
выполнения операции не были нажаты клавиши-модификаторы. Возможные действия могут быть заданы следующими атрибутами класса QtCore.Qt:
- CopyAction (или 1) - копирование,
- MoveAction (или 2) - перемещение,
- LinkAction (или 4) - создание ссылки,
- IgnoreAction (или 0) - действие игнорировано,
- TargetMoveAction (или 32770) - в Windows это значение используется, когда право собственности на перетаскиваемые переходит к целевому приложению, то есть исходное
приложение не должно удалять данные.
Пример:
act = drag.exec (QtCore.Qt.MoveAction | QtCore.Qt.CopyAction,
QtCore.Qt.MoveAction)
Вместо метода exec() можно использовать аналогичный метод ехес_(), сохраненный в PyQt5 для совместимости с кодом, написанным под библиотеку PyQt4;
- setMimeData (<QMimeData>) - позволяет задать перемещаемые данные. В качестве значения указывается экземпляр класса QMimeData. Пример передачи текста:
data = QtCore.QMimeData()
data.setText("Перетаскиваемый текст")
drag = QtGui.QDrag(self)
drag.setMimeData(data)
- mimeData () - возвращает экземпляр класса QMimeData с перемещаемыми данными;
- setPixmap (<QPixmap>) - задает изображение, которое будет перемещаться вместе с указателем мыши. В качестве параметра указывается экземпляр класса QPixmap. Пример:
drag.setPixmap (QtGui.QPixmap ("dd_representer.png" ) )
- pixmap () - возвращает экземпляр класса QPixmap с изображением, которое перемещается вместе с указателем;
- setHotSpot (<QPoint>) - задает координаты "горячей" точки на перемещаемом изображении. В качестве параметра указывается экземпляр класса QPoint. Пример:
drag.setHotSpot (QtCore.QPoint (20, 20))
- hotSpot () - возвращает экземпляр класса QPoint с координатами "горячей" точки на перемещаемом изображении;
- setDragCursor (<QPixmap>, <Действие>) - позволяет изменить внешний вид указателя мыши для действия, указанного во втором параметре. Первым параметром
передается экземпляр класса QPixmap, который, собственно, станет указателем мыши. Если в первом параметре указан пустой объект класса QPixmap, ранее установленный указатель
для действия будет отменен. Пример изменения указателя для перемещения:
drag.setDragCursor (QtGui.QPixmap ("move_cursor.png"),
QtCore.Qt.MoveAction)
- dragCursor (<Действие>) - возвращает экземпляр класса QPixmap, представляющий указатель мыши для заданного действия;
- source () - возвращает ссылку на компонент-источник;
- target () - возвращает ссылку на компонент-приемник или значение None, если компонент находится в другом приложении;
- supportedActions () - возвращает значение, представляющее комбинацию допустимых в текущей операции действий. Возможные действия обозначаются перечисленными ранее атрибутами класса QtCore.Qt;
- defaultAction () - возвращает действие по умолчанию в виде одного из перечисленных ранее атрибутов класса QtCore.Qt.
Класс QDrag поддерживает два сигнала:
- actionChanged (<Действие>) - генерируется при изменении действия. Новое действие представляется одним из перечисленных ранее атрибутов класса QtCore.Qt;
- targetChanged (<Компонент>) - генерируется при изменении принимающего компонента, который представляется экземпляром соответствующего класса.
Пример назначения обработчиков сигналов:
drag.actionChanged.connect (self.on_action_changed)
drag.targetChanged.connect (self.on_target_changed)
На следующем шаге мы рассмотрим класс QMimeData.
Предыдущий шаг
Содержание
Следующий шаг