Шаг 74.
Библиотека PyQt5.
Обработка сигналов и событий. Технология drag & drop. Обработка сброса
На этом шаге мы рассмотрим действия, которые должны быть выполнены при обработке сброса.
Прежде чем обрабатывать перетаскивание и сбрасывание объекта, необходимо сообщить системе, что компонент может обрабатывать эти события. Для этого внутри конструктора компонента следует
вызвать метод setAcceptDrops(), унаследованный от класса QWidget, и передать этому методу True:
self.setAcceptDrops (True)
Обработка перетаскивания и сброса объекта выполняется следующим образом:
- Внутри метода dragEnterEvent() компонента проверяется MIME-тип перетаскиваемых данных и действие. Если компонент способен обработать сброс этих данных и соглашается
с предложенным действием, необходимо вызвать метод acceptProposedAction() объекта события. Если нужно изменить действие, то методу setDropAction() объекта события
передается новое действие, а затем у того же объекта вызывается метод accept() вместо acceptProposedAction().
- Если необходимо ограничить область сброса некоторым участком компонента, следует дополнительно определить в нем метод dragMoveEvent(). Этот метод будет постоянно
вызываться при перетаскивании внутри области компонента. При достижении указателем мыши нужного участка компонента следует вызвать метод accept() и передать ему
экземпляр класса QRect с координатами и размером этого участка. В этом случае при перетаскивании внутри участка метод dragMoveEvent() повторно вызываться не будет.
- Внутри метода dropEvent() компонента производится обработка сброса.
Обработать события, возникающие в процессе перетаскивания и сбрасывания, позволяют следующие методы класса QWidget:
- dragEnterEvent (self, <event>) - вызывается, когда перетаскиваемый объект входит в область компонента. Через параметр <event> доступен экземпляр класса QDragEnterEvent;
- dragLeaveEvent (self, <event>) - вызывается, когда перетаскиваемый объект покидает область компонента. Через параметр <event> доступен экземпляр класса QDragLeaveEvent;
- dragMoveEvent (self, <event>) - вызывается при перетаскивании объекта внутри области компонента. Через параметр <event> доступен экземпляр класса QDragMoveEvent;
- dropEvent (self, <event>) - вызывается при сбрасывании объекта в области компонента. Через параметр <event> доступен экземпляр класса QDropEvent.
Класс QDragLeaveEvent наследует класс QEvent и не несет никакой дополнительной информации. Достаточно просто знать, что перетаскиваемый объект покинул область компонента.
Цепочка наследования остальных классов выглядит так:
QEvent - QDropEvent - QDragMoveEvent - QDragEnterEvent
Класс QDragEnterEvent не содержит собственных методов, но наследует все методы классов QDropEvent и QDragMoveEvent.
Класс QDropEvent поддерживает следующие методы:
- mimeData () - возвращает экземпляр класса QMimeData с перемещаемыми данными и информацией о MIME-типе;
- pos () - возвращает экземпляр класса QPoint с целочисленными координатами сбрасывания объекта;
- posF () - возвращает экземпляр класса QPointF с вещественными координатами сбрасывания объекта;
- possibleActions () - возвращает комбинацию возможных действий при сбрасывании. Пример определения значений:
if e.possibleActions() & QtCore.Qt.MoveAction:
print("MoveAction")
if e.possibleActions() & QtCore.Qt.CopyAction:
print("CopyAction")
- proposedAction () - возвращает действие по умолчанию при сбрасывании;
- acceptProposedAction () - сообщает о готовности принять переносимые данные и согласии с действием, возвращаемым методом proposedAction(). Метод
acceptProposedAction() (или метод accept(), поддерживаемый классом QDragMoveEvent) необходимо вызвать внутри метода dragEnterEvent(), иначе метод
dropEvent() вызван не будет;
- setDropAction (<Действие>) - позволяет указать другое действие при сбрасывании. После изменения действия следует вызвать метод accept(), а не acceptProposedAction();
- dropAction () - возвращает действие, которое должно быть выполнено при сбрасывании. Оно может не совпадать со значением, возвращаемым методом proposedAction(),
если действие было изменено с помощью метода setDropAction();
- ksyboardModifiers () - позволяет определить, какие клавиши-модификаторы (Shift, Ctrl, Alt и др.) были нажаты вместе с кнопкой мыши. Возможные значения мы уже
рассматривали на 64 шаге;
- mouseButtons () - позволяет определить кнопки мыши, которые были нажаты в процессе переноса данных;
- source () - возвращает ссылку на компонент внутри приложения, являющийся источником события, или значение None, если данные переносятся из другого приложения.
Теперь рассмотрим методы класса QDragMoveEvent:
- accept ([<QRect>]) - сообщает о согласии с дальнейшей обработкой события. В качестве параметра можно указать экземпляр класса QRect с координатами и размерами
прямоугольной области, в которой будет доступно сбрасывание;
- ignore ([<QRect>]) - отменяет операцию переноса данных. В качестве параметра можно указать экземпляр класса QRect с координатами и размерами прямоугольной области,
в которой сбрасывание запрещено;
- answerRect () - возвращает экземпляр класса QRect с координатами и размерами прямоугольной области, в которой произойдет сбрасывание, если событие будет принято.
Некоторые компоненты в PyQt уже поддерживают технологию drag & drop - так, в однострочное текстовое поле можно перетащить текст из другого приложения. Поэтому, прежде чем
изобретать свой "велосипед", убедитесь, что поддержка технологии в компоненте не реализована.
На следующем шаге мы рассмотрим работу с буфером обмена.
Предыдущий шаг
Содержание
Следующий шаг