Шаг 74.
Библиотека PyQt5.
Обработка сигналов и событий. Технология drag & drop. Обработка сброса

    На этом шаге мы рассмотрим действия, которые должны быть выполнены при обработке сброса.

    Прежде чем обрабатывать перетаскивание и сбрасывание объекта, необходимо сообщить системе, что компонент может обрабатывать эти события. Для этого внутри конструктора компонента следует вызвать метод setAcceptDrops(), унаследованный от класса QWidget, и передать этому методу True:

  self.setAcceptDrops (True)

    Обработка перетаскивания и сброса объекта выполняется следующим образом:

  1. Внутри метода dragEnterEvent() компонента проверяется MIME-тип перетаскиваемых данных и действие. Если компонент способен обработать сброс этих данных и соглашается с предложенным действием, необходимо вызвать метод acceptProposedAction() объекта события. Если нужно изменить действие, то методу setDropAction() объекта события передается новое действие, а затем у того же объекта вызывается метод accept() вместо acceptProposedAction().
  2. Если необходимо ограничить область сброса некоторым участком компонента, следует дополнительно определить в нем метод dragMoveEvent(). Этот метод будет постоянно вызываться при перетаскивании внутри области компонента. При достижении указателем мыши нужного участка компонента следует вызвать метод accept() и передать ему экземпляр класса QRect с координатами и размером этого участка. В этом случае при перетаскивании внутри участка метод dragMoveEvent() повторно вызываться не будет.
  3. Внутри метода dropEvent() компонента производится обработка сброса.

    Обработать события, возникающие в процессе перетаскивания и сбрасывания, позволяют следующие методы класса QWidget:

    Класс QDragLeaveEvent наследует класс QEvent и не несет никакой дополнительной информации. Достаточно просто знать, что перетаскиваемый объект покинул область компонента.

    Цепочка наследования остальных классов выглядит так:

  QEvent - QDropEvent - QDragMoveEvent - QDragEnterEvent

    Класс QDragEnterEvent не содержит собственных методов, но наследует все методы классов QDropEvent и QDragMoveEvent.

    Класс QDropEvent поддерживает следующие методы:

    Теперь рассмотрим методы класса QDragMoveEvent:

    Некоторые компоненты в PyQt уже поддерживают технологию drag & drop - так, в однострочное текстовое поле можно перетащить текст из другого приложения. Поэтому, прежде чем изобретать свой "велосипед", убедитесь, что поддержка технологии в компоненте не реализована.

    На следующем шаге мы рассмотрим работу с буфером обмена.




Предыдущий шаг Содержание Следующий шаг