Здесь мы хотим позволить пользователю переносить файлы, но не более того. Для этого мы проверяем MIME—тип переносимого объекта. MIME—тип text/uri-list используется для хранения списка универсальных идентификаторов ресурсов (URI — universal resource identifier), в качестве которых могут выступать имена файлов, адреса URL (например, адресные пути HTTP и FTP) или идентификаторы других глобальных ресурсов. Стандартные типы MIME определяются Агентством по выделению имен и уникальных параметров протоколов сети Интернет (Internet Assigned Numbers Authority — IANA). Они состоят из типа и подтипа, разделенных слешем. Типы MIME используются буфером обмена и механизмом «drag-and-drop» для идентификации различных типов данных. Официальный список MIME—типов доступен по адресу http://www.iana.org/assignments/media-types/.

01 void MainWindow::dropEvent(QDropEvent *event)

02 {

03 QList urls = event->mimeData()->urls();

04 if (urls.isEmpty())

05 return;

06 QString fileName = urls.first().toLocalFile();

07 if (fileName.isEmpty())

08 return;

09 if (readFile(fileName))

10 setWindowTitle(tr("%1 -%2").arg(fileName)

11 .arg(tr("Drag File")));

12 }

Функция 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. Ниже приводится определение класса:

01 class ProjectListWidget : public QListWidget

02 {

03 Q_OBJECT

04 public:

05 ProjectListWidget(QWidget *parent= 0);

06 protected:

07 void mousePressEvent(QMouseEvent *event);

08 void mouseMoveEvent(QMouseEvent *event);

09 void dragEnterEvent(QDragEnterEvent *event);

10 void dragMoveEvent(QDragMoveEvent *event);

11 void dropEvent(QDropEvent *event);

12 private:

13 void startDrag();

14 QPoint startPos;

15 };

ProjectListWidget переопределяет пять обработчиков событий, которые объявлены в QWidget.

01 ProjectListWidget::ProjectListWidget(QWidget *parent)

02 : QListWidget(parent)

03 {

04 setAcceptDrops(true);

05 }

В конструкторе мы обеспечиваем возможность приема переносимого объекта в виджете со списком.

01 void ProjectListWidget::mousePressEvent(QMouseEvent *event)

02 {

03 if (event->button() == Qt::LeftButton)

04 startPos = event->pos();

05 QListWidget::mousePressEvent(event);

06 }

Когда пользователь нажимает левую кнопку мышки, мы сохраняем позицию мышки в закрытой переменной startPos. Мы вызываем определенную в классе QListWidget функцию mousePressEvent() для обеспечения обработки в QListWidget обычным образом события нажатия кнопкй мышки.

Перейти на страницу:

Похожие книги