Функция dropEvent() вызывается, когда пользователь отпускает объект на виджете. Мы вызываем функцию QMimeData:: urls() для получения списка адресов QUrl. Обычно пользователи переносят одновременно только один файл, но возможен также перенос сразу нескольких выделенных файлов. Если имеется несколько URL или полученный URL оказывается нелокальным, мы немедленно возвращаем управление.
QWidget содержит также функции dragMoveEvent() и dragLeaveEvent(), но для большинства приложений не потребуется Их переопределять.
Второй пример показывает, Как следует инициировать перетаскивание объекта и принимать его после отпускания. Мы создадим подкласс QListWidget, который будет поддерживать механизм «drag-and-drop» и входить в приложение Project Chooser (составитель проектов), показанное на рис. 9.1.

Рис. 9.1. Приложение Project Chooser
Приложение Project Chooser предоставляет пользователю два виджета со списками имен людей. Каждый список представляет проект. Пользователь может с помощью механизма «drag-and-drop» перевести человека из одного проекта в другой.
Программный код по обеспечению механизма «drag-and-drop» находится в подклассе QListWidget. Ниже приводится определение класса:
class ProjectListWidget : public QListWidget
Q_0BJECT public:
ProjectListWidget(QWidget *parent = 0); protected:
void mousePressEvent(QMouseEvent *event); void mouseMoveEvent(QMouseEvent *event); void dragEnterEvent(QDragEnterEvent *event); void dragMoveEvent(QDragMoveEvent *event); void dropEvent(QDropEvent *event);
private:
void startDrag();
QPoint startPos;
};
ProjectListWidget переопределяет пять обработчиков событий, которые объявлены в QWidget.
.ProjectListWidget::ProjectListWidget(QWidget *parent):: QListWidget (parent),
{
setAcceptDrops(t rue);
}
В конструкторе мы обеспечиваем возможность приема переносимого объекта в виджете со списком.
void ProjectListWidget::mousePressEvent(QMouseEvent *event) {
if (event->button() -= Qt::LeftButton)
startPos = event->po.$(); QListWidget::mousePressEvent(event);
}
Когда пользователь нажимает левую кнопку мышки, мы сохраняем позицию мышки в закрытой переменной startPos. Мы вызываем определенную в классе QListWidget функцию mbusePressEventO для обеспечения обработки в QListWidget обычным образом события нажатия кнопки мышки.
<< назад вперед >>