Чтение онлайн

на главную - закладки

Жанры

QT 4: программирование GUI на С++

Саммерфилд Марк

Шрифт:

01 voidMainWindow::dragEnterEvent(QDragEnterEvent *event)

02 {

03 if (event->mimeData->hasFormat("text/uri-list"))

04 event->acceptProposedAction;

05 }

Функция dragEnterEvent вызывается всякий раз, когда пользователь переносит объект на какой-нибудь виджет. Если мы вызываем функцию acceptProposedAction при обработке этого события, мы указываем, что пользователь может отпустить переносимый объект в данном виджете. По умолчанию виджет не смог

бы принять переносимый объект. Qt автоматически изменяет форму курсора для уведомления пользователя о возможности или невозможности приема объекта виджетом.

Здесь мы хотим позволить пользователю переносить файлы, но не более того. Для этого мы проверяем 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<QUrl> 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 обычным образом события нажатия кнопкй мышки.

01 void ProjectListWidget::mouseMoveEvent(QMouseEvent *event)

02 {

03 if (event->buttons & Qt::LeftButton) {

04 int distance = (event->pos - startPos).manhattanLength;

05 if (distance >= QApplication::startDragDistance)

06 startDrag;

07 }

08 QListWidget::mouseMoveEvent(event);

09 }

Действие, при котором пользователь перемещает курсор мышки и одновременно держит нажатой левую кнопку, мы рассматриваем как начало перетаскивания объекта. Мы вычисляем расстояние между текущей позицией мышки и позицией нажатия левой кнопки мышки. Если это расстояние превышает рекомендованное в QApplication расстояние для регистрации начала перетаскивания (обычно 4 пикселя), мы вызываем закрытую функцию startDrag для запуска процесса перетаскивания объекта. Это предотвращает инициирование процесса перетаскивания из-за дрожания руки пользователя.

Поделиться:
Популярные книги

Лекарь Империи 2

Карелин Сергей Витальевич
2. Лекарь Империи
Фантастика:
городское фэнтези
аниме
дорама
фэнтези
попаданцы
5.00
рейтинг книги
Лекарь Империи 2

Свет горизонта

BlackRaven
1. Свет горизонта
Фантастика:
фэнтези
6.00
рейтинг книги
Свет горизонта

Последний Паладин. Том 8

Саваровский Роман
8. Путь Паладина
Фантастика:
боевая фантастика
попаданцы
5.00
рейтинг книги
Последний Паладин. Том 8

Тринадцатый IV

NikL
4. Видящий смерть
Фантастика:
боевая фантастика
попаданцы
5.00
рейтинг книги
Тринадцатый IV

Звездная Кровь. Экзарх II

Рокотов Алексей
2. Экзарх
Старинная литература:
прочая старинная литература
5.00
рейтинг книги
Звездная Кровь. Экзарх II

Седьмая встреча

Вассму Хербьёрг
Проза:
современная проза
4.00
рейтинг книги
Седьмая встреча

Меняя маски

Метельский Николай Александрович
1. Унесенный ветром
Фантастика:
боевая фантастика
попаданцы
9.22
рейтинг книги
Меняя маски

Наемный корпус

Вайс Александр
5. Фронтир
Фантастика:
боевая фантастика
космическая фантастика
космоопера
5.00
рейтинг книги
Наемный корпус

Товарищ "Чума" 10

lanpirot
10. Товарищ "Чума"
Фантастика:
городское фэнтези
попаданцы
альтернативная история
5.00
рейтинг книги
Товарищ Чума 10

Менталист. Революция

Еслер Андрей
3. Выиграть у времени
Фантастика:
боевая фантастика
5.48
рейтинг книги
Менталист. Революция

Идеальный мир для Лекаря

Сапфир Олег
1. Лекарь
Фантастика:
фэнтези
юмористическое фэнтези
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря

Наследник

Назимов Константин Геннадьевич
3. Травник
Фантастика:
фэнтези
6.80
рейтинг книги
Наследник

Адвокат

Константинов Андрей Дмитриевич
1. Бандитский Петербург
Детективы:
боевики
8.00
рейтинг книги
Адвокат

Эммануэль

Арсан Эммануэль
1. Эммануэль
Любовные романы:
эро литература
7.38
рейтинг книги
Эммануэль