Обработка сброса

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

void setAcceptDrops(bool on)

Пример:

setAcceptDrops(true);

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

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

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

  • dragEnterEvent() — вызывается, когда перетаскиваемый объект входит в область компонента. Через параметр доступен указатель на экземпляр класса QDragEnterEvent. Прототип метода:
virtual void dragEnterEvent(QDragEnterEvent *event)
  • dragLeaveEvent() — вызывается, когда перетаскиваемый объект покидает область компонента. Через параметр доступен указатель на экземпляр класса QDragLeaveEvent. Прототип метода:
virtual void dragLeaveEvent(QDragLeaveEvent *event)
  • dragMoveEvent() — вызывается при перетаскивании объекта внутри области компонента. Через параметр доступен указатель на экземпляр класса QDragMoveEvent. Прототип метода:
virtual void dragMoveEvent(QDragMoveEvent *event)
  • dropEvent() — вызывается при сбрасывании объекта в области компонента. Через параметр доступен указатель на экземпляр класса QDropEvent. Прототип метода:
virtual void dropEvent(QDropEvent *event)

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

QEvent — QDropEvent — QDragMoveEvent — QDragEnterEvent

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

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

  • mimeData() — возвращает указатель на экземпляр класса QMimeData с перемещаемыми данными и информацией о MIME-типе. Прототип метода:
const QMimeData *mimeData() const
  • position() — возвращает экземпляр класса QPointF с координатами сбрасывания объекта. Прототип метода:
QPointF position() const
  • possibleActions() — возвращает комбинацию возможных действий при сбрасывании. Прототип метода:
Qt::DropActions possibleActions() const

Пример определения значений:

if (e->possibleActions() & Qt::MoveAction) {
   qDebug() << "MoveAction";
}
if (e->possibleActions() & Qt::CopyAction) {
   qDebug() << "CopyAction";
}
  • proposedAction() — возвращает действие по умолчанию при сбрасывании. Прототип метода:
Qt::DropAction proposedAction() const
  • acceptProposedAction() — устанавливает флаг готовности принять перемещаемые данные и согласия с действием, возвращаемым методом proposedAction(). Метод acceptProposedAction() (или метод accept()) необходимо вызвать внутри метода dragEnterEvent(), иначе метод dropEvent() вызван не будет. Прототип метода:
void acceptProposedAction()
  • setDropAction() — позволяет изменить действие при сбрасывании. После изменения действия следует вызвать метод accept(), а не acceptProposedAction(). Прототип метода:
void setDropAction(Qt::DropAction action)
  • dropAction() — возвращает действие, которое должно быть выполнено при сбрасывании. Возвращаемое значение может не совпадать со значением, возвращаемым методом proposedAction(), если действие было изменено с помощью метода setDropAction(). Прототип метода:
Qt::DropAction dropAction() const
  • modifiers() — позволяет определить, какие клавиши-модификаторы (<Shift>, <Ctrl>, <Alt> и др.) были нажаты вместе с кнопкой мыши. Возможные значения мы уже рассматривали в разд. 4.8.3. Прототип метода:
Qt::KeyboardModifiers modifiers() const
  • buttons() — позволяет определить кнопки мыши, которые нажаты. Прототип метода:
Qt::MouseButtons buttons() const
  • source() — возвращает указатель на компонент внутри приложения, являющийся источником события, или нулевой указатель. Прототип метода:
QObject *source() const

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

  • accept() — устанавливает флаг, который является признаком согласия с дальнейшей обработкой события. В качестве параметра можно указать экземпляр класса QRect с координатами и размерами прямоугольной области, в которой сбрасывание будет принято. Прототипы метода:
void accept()
void accept(const QRect &rectangle)
  • ignore() — сбрасывает флаг, что является запретом на дальнейшую обработку события. В качестве параметра можно указать экземпляр класса QRect с координатами и размерами прямоугольной области, в которой сбрасывание выполнить нельзя. Прототипы метода:
void ignore()
void ignore(const QRect &rectangle)
  • answerRect() — возвращает экземпляр класса QRect с координатами и размерами прямоугольной области, в которой произойдет сбрасывание, если событие будет принято. Прототип метода:
QRect answerRect() const

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

Учебник C++ (Qt Creator и MinGW)
Учебник C++ (Qt Creator и MinGW) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов