Namespaces

Variants
Actions

Please note that as of October 24, 2014, the Nokia Developer Wiki will no longer be accepting user contributions, including new entries, edits and comments, as we begin transitioning to our new home, in the Windows Phone Development Wiki. We plan to move over the majority of the existing entries over the next few weeks. Thanks for all your past and future contributions.

Обработка событий в классе QObject

From Wiki
Jump to: navigation, search
Article Metadata

Совместимость
Платформа(ы):
Symbian

Статья
Автор: Den123 (13 Jan 2009)
Последнее редактирование: hamishwillee (08 May 2013)

События используются для оповещения объектов о возникновении/изменении каких-либо ситуаций. Основными источниками событий являются элементы пользовательского интерфейса, кроме того существуют события, генерируемые системными объектами (например, таймерами). С помощью событий можно отслеживать, например: моменты нажатия/отпускания клавиш, необходимость перерисовки элементов пользовательского интерфейса и т.д. То есть, в отличии от сигналов/слотов, обработка событий - это достаточно низкоуровневый механизм.

В общем случае, сразу после возникновения, событие помещается в очередь для дальнейшей обработки. Базовый класс QObject содержит виртуальный метод
bool event (QEvent* event) перекрыв который можно обработать поступившее событие. Если событие было успешно обработано - следует вернуть true, в этом случае событие будет удалено из очереди. Если событие не предназначено для данного объекта (его должен обработать предок) - следует вернуть false.

Для обработки событий пользовательского интерфейса перекрывать метод virtual bool event ( QEvent * e ) не рекоммендуется, т.к. визуальные элементы содержат специализированные методы для этой цели (например, keyPressEvent(), keyReleasEvent()).

Стоит также отметить, что Qt позволяет определять и генерировать собственые события в пользовательских классах. QObject содержит виртуальный метод
bool customEvent(QEvent* event) - данный обработчик необходимо перекрыть, если класс должен реагировать на события, определенные пользователем.

Важно помнить о том, что обработка событий происходит в событийном цикле (event loop), в рамках основного потока. При выполнении ресурсоемких вычислений может возникнуть ситуация, когда передача управления диспетчеру событий происходит с серьезной задержкой - в результате могут возникнуть проблемы с перерисовкой пользовательского интерфейса, реакция на действия пользователя также может стать замедленной. Чтобы избежать подобных проблем, функции, которые длительное время не возвращают управление, должны время от времени вызывать метод processEvents() основного класса приложения QCoreApplication. Этот метод производит отправку всех накопившихся событий из очереди.

Qt позволяет использовать фильтры событий. Для того, чтобы реализовать фильтр, нужно создать собственного наследника QObject и реализовать в нем метод
bool eventFilter(), который будет вызываться каждый раз при поступлении события для объекта у которого этот фильтр установлен. В качестве параметров данного метода выступают указатель на объект, для которого предназначено событие и указатель на объект события. Метод должен вернуть true, если событие не должно передаваться для обработки объекту, для которого оно предназначено, иначе метод должен вернуть false. Для установки фильтра в QObject содержится метод installEventFilter().

Для установки глобального фильтра событий можно воспользоваться методом installEventFilter() класса QCoreApplication. В этом случае установленный фильтр будет получать события раньше всех остальных объектов приложения.

Для искусственной генерации событий можно воспользоваться методами QCoreApplication:

  • sendEvent() - отправляет событие для предназначенного объекта без задержки
  • postEvent() - помещает указанное событие в очередь

Используя возможности фильтрации и искусственной генерации событий, поддерживаемых классом QObject, можно осуществлять "подмену" событий. Эти возможности актуальны при автоматизированном тестировании пользовательского интерфейса.

This page was last modified on 8 May 2013, at 00:04.
219 page views in the last 30 days.

Was this page helpful?

Your feedback about this content is important. Let us know what you think.

 

Thank you!

We appreciate your feedback.

×