Функция 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 обычным образом события нажатия кнопки мышки.


<< назад вперед >>