На этом шаге рассмотрим остальные классы событий.
Класс QChildEvent
Это событие происходит в момент создания или удаления объекта-потомка. Объект события передается в метод childEvent(), который определен в классе QObject.
Вызовом метода QChildEvent::child() можно получить указатель на этот объект. При помощи методов QChildEvent::added() и QChildEvent::removed() можно узнать о создании и удалении объекта-потомка.
Класс QCloseEvent
Событие класса QCloseEvent создается при закрытии окна виджета. Оно может быть вызвано пользователем или методом QWidget::close(). Объект класса QCloseEvent передается в метод closeEvent(), в котором можно спросить пользователя, действительно ли он хочет закрыть приложение. Это имеет смысл в тех случаях, когда пользователь не сохранил свои данные.
При помощи методов accept() и ignore() устанавливается флаг, сообщающий о согласии получателя события закрыть окно. Вызов accept() приведет к тому, что после возвращения из этого метода окно будет спрятано методом hide(). Вызов ignore() оставит окно без изменений.
Класс QHideEvent
Данное событие создается при нажатии пользователем кнопки свертывания приложения. Также, это событие может быть вызвано методом hide(), делающим виджет невидимым. Объект события класса QHideEvent передается в метод hideEvent().
Класс QMoveEvent
Событие класса QMoveEvent возникает при перемещении виджета. Для виджетов верхнего уровня это соответствует перемещению его окна. Объект события класса QMoveEvent передается в метод moveEvent() и содержит информацию о старых и новых координатах виджета, которые можно получить вызовом методов pos() и oldPos().
Класс QShowEvent
Событие генерируется при создании виджета и при вызове метода show(). Объект события QShowEvent передается в метод showEvent().
Класс QResizeEvent
Пользователь может изменять размеры окна при помощи мыши. При этом создается объект события QResizeEvent. Объект передается в метод resizeEvent() и содержит информацию о старых и новых размерах виджета, которые можно получить вызовом методов size() и oldSize().
Реакции на изменение размеров виджета могут быть следующими:
Пример, показанный на рис. 1, демонстрирует перезапись методов resizeEvent(), showEvent(), moveEvent(), hideEvent(), closeEvent(). В окне отображается:
Рис.1. Пример изменения размера окна
Приведем текст программы, результат работы которой представлен на рисунке 1.
class DemoEvent : public QLabel { public: //в конструкторе объекта устанавливается позиционирование текста по центру DemoEvent(QWidget* pwgt = 0) : QLabel(pwgt) { setAlignment(Qt::AlignCenter); } protected: //событие изменение размера виджета virtual void resizeEvent(QResizeEvent* pe) { //выводим в надпись информацию о текущих размерах окна setText(QString("Изменение размера окна") + "\nШирина = " + QString::number(pe->size().width()) + "\nВысота = " + QString::number(pe->size().height()) ); } //событие перемещения виджета virtual void moveEvent(QMoveEvent *me) { //выводим в надпись информацию о позиции верхнего левого угла окна setText(QString("Перемещение окна") + "\nКоордината x =" + QString::number(me->pos().x()) + "\nКоордината y =" + QString::number(me->pos().y()) ); } //событие отображения виджета virtual void showEvent(QShowEvent *) { //выводим в надпись текст setText(QString("Создали виджет надписи")); } //событие свертывания приложения virtual void hideEvent(QHideEvent *) { //создаем новый виджет надписи и выводим сообщение о событии QLabel *l = new QLabel("Окно свернули на панель задач"); l->resize(250,50); l->show(); } //событие закрытия окна виджета virtual void closeEvent(QCloseEvent *) { //создаем новый виджет надписи и выводим сообщение о событии QLabel *l = new QLabel("Окно закрыли"); l->>resize(250,50); l->show(); } };
Файлы приложения можно взять здесь.
На следующем шаге рассмотрим реализацию собственных классов событий.