Обработка стандартных событий




Графических объекты из библиотеки QtWidget.h имеют ряд виртуальных функций, предназначенных для обработки стандартных событий внутри объекта. Виртуальные функции используются в C++ для переопределения в классах наследниках. Некоторые из функций-обработчиков перечислены в таблице. Механизм обработки событий является механизмом более низкого уровня по сравнению с механизмом взаимодействия сигнал-слот.

Таблица – Функции для обработки стандартных событий

Функция Событие
keyPressEvent (QKeyEvent *event) Нажатие клавиши клавиатуры
keyReleaseEvent (QKeyEvent *event) Отпускание клавиши клавиатуры
mouseDoubleClickEvent (QMouseEvent *event) Двойной щелчок клавиши мыши
mouseMoveEvent(QMouseEvent *event) Перемещение курсора мыши после нажатия клавиши
mousePressEvent(QMouseEvent *event) Нажатие клавиши мыши
mouseReleaseEvent(QMouseEvent *event) Отпускание клавиши мыши
moveEvent(QMoveEvent *event) Перенос объекта
resizeEvent(QResizeEvent* event) Сообщает об изменении размера виджета (изменение уже произошло)
paintEvent(QPaintEvent *event) Перерисовка виджета
closeEvent(QCloseEvent *event) Закрытие окна. Выполняется при закрытии окна. Позволяет контролировать закрыто окно после обработки события или нет.

 

Переопределив эти функции в классе-наследнике можно их использовать для обработки действий пользователя [Шлее 5.3 c. 233-251, Иванова с. 44-50]. Рассмотрим примет перемещения мыши и зажатой кнопкой над окном. В описании класса (mainwindow.h) в раздел privet класса (MainWindow) добавляем объявление функции mouseMoveEvent()

 

privet:

void mouseMoveEvent (QMouseEvent *);

 

и определяет её в файле mainwindow.cpp

 

void MainWindow:: mouseMoveEvent (QMouseEvent *event);

{

QDеbug() << event->x() << event->y();

}

 

Использование этого механизма позволяет получить более детальные сведения о действиях пользователя, по средствам аргумента функции. Так объект класс QMouseEvent передаёт информацию о координатах нажатия мыши и нажатой кнопке. Например, условие проверяющее нажатие средней кнопки мыши будет выглядеть как

 

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

 

Таблица – некоторые константы, соответствующие нажатым кнопкам мыши

Клавиша Значение
Левая Qt::LeftButton
Правая Qt::RightButton
Средняя Qt::MidButton
«Back» Qt::BackButton
«Forward» Qt::XButton2

 

Аналогично можно добавить условие проверяющее нажатие модификатора (кнопки клавиатуры).

 

if(event->modifiers() == Qt::ControlModifier)

qDebug() << "Ctrl";

 

Таблица – некоторые константы, соответствующие зажатым кнопкам на клавиатуре

Клавиша Значение
Никакая Qt::NoModifier
Shift Qt::ShiftModifier
Ctrl Qt::ControlModifier
Alt Qt::AltModifier

 

Согласно логике применения виртуальных функций, они теряют функционал своего предка. Но иногда его нужно сохранить. Для этого в их реализации следует добавить строчку, содержащую название этой функции из класса-родителя и передать в эту функцию аргумент. Так, рассмотренный пример будет реализован как

 

void MainWindow:: mouseMoveEvent (QMouseEvent *event);

{

QMainWindow:: mouseMoveEvent (event);

}

 

Подробнее об обработке событиях [Бланшет 2 гл. 7, Шлее 5.3 гл. 14]. На этом заканчивается перечень тем, которые должны быть изучены для создания простейших графических приложений. Для закрепления знаний выполните задание из темы 3 (см. ниже).

Углубление знаний

Работа с файлами, диалоги

Класс QFile

Для работы с файлом необходимо создать объект класса QFile и задать для него путь к файлу (абсолютный или относительный), с которым вы будете работать. Путь и имя передают как параметр конструктора или с помощью метода setFileName().

 

QFile file;

file. setFileName("text.txt");

 

Далее файл необходимо открыть и задать режим доступа к нему. Метод open() принимает флаги доступа и возвращает true, если файл удалось открыть.

Таблица – Флаги доступа к файлу

Флаг доступа Значение
QIODevice::ReadOnly открыть для чтения
QIODevice::WriteOnly открыть для записи
QIODevice::ReadWrite открыть для чтения и записи
QIODevice::Append все данные будут добавляться в конец файла (после уже существующих данных)
QIODevice::Truncate если возможно, стереть содержимое файла перед открытием
QIODevice::Text режим работы с текстовым файлом

 

Для чтения одной строки текстового файла используют метод readLine(). Для чтения всего содержимого можно воспользоваться методом readAll(). Метод atEnd() позволяет определить достигли ли мы конца файла при чтении. После завершения работы с файлом его нужно закрыть вызовом метода close(). Следующий пример демонстрирует чтение текстового файла и вывод его в консоль.

 

if (!file.open(QIODevice::ReadOnly | QIODevice::Text))

{

//Если открыть файл не удалось — выводим сообщение

}

else

{

while (!file.atEnd())

{

qDebug() << file.readLine();// выводить её в консоль

}

}

file.close();//Заканчиваем работу с файлом

 

Условие в коде программы значит, что файл не открыт в режиме для чтения (но не записи или добавления) текста (а не бинарных данных). Условие в цикле while означает "пока не конец файла".

Подробнее о работе с файлами (классы QBuffer, QTemporaryFile, QFileSystemWatcher – отслеживание изменений файлов и папок, QTextStream и QDataStream) см. [Шлее 5.3 гл. 36 с. 515-519 и 527-529].

Класс QDir

Класс предоставляет инструменты для работы с файловой системой. Функция setPath() позволяет задать каталог для объекта

 

QDir dir;

dir.setPath("F:/Музыка");

 

Для создания каталога нужно воспользоваться функцией mkdir()

 

if(! dir.mkdir("новая"));

{

// папка не создана

}

 

которая в качестве аргумента забирает название создаваемого каталога и возвращает истину если файл создан (в противном случае ложь). С помощью метода exists() можно проверить существует ли папка. Функция rename() позволяет переименовать файл или каталог. Удаление пустого каталога осуществляет функция rmdir().

Но основным предназначением класса является просмотр содержимого каталога. При этом допускается применение фильтров, исключающих отдельные группы файлов. Метод entryList() возвращает список найденных элементов

 

qDebug() << dir.entryList();

 

результат работы следующий список

(".", "..", "GjeldRune", "Джин-Тоник", "новая", "Северный флот (TODD)-грехи.mp3", "Чёрный обелиск")

При использовании фильтров

 

dir.setFilter(QDir::Files);

qDebug() << dir.entryList();

 

будет выведен усечённый список

("Северный флот (TODD)-грехи.mp3")

Подробнее о прикладных возможностях работы с файлом можно узнать из [Шлее 5.3 гл. 36 с. 519-523] или из примера FileFinder.



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2017-04-03 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: