Установка фильтров событий

Одним из действительно эффективных средств в модели событий Qt является возможность с помощью некоторого экземпляра объекта QObject контролировать события другого экземпляра объекта QObject еще до того, как они дойдут до послед­него.

Предположим, что наш виджет Customerlnf oDialog состоит из нескольких редак­торов строк QLineEdit и мы хотим использовать клавишу Space (пробел) для переда­чи фокуса следующему QLineEdit, Такой необычный режим работы может оказаться полезным для разработки, предназначенной для собственных нужд, и когда пользо­ватели имеют навык работы в таком режиме. Простое решение заключается в созда­нии подкласса QLineEdit и переопределении функции keyPressEventO для вызова focusNextChildO. и оно выглядит следующим образом: •

void MyLineEdit::keyPressEvent(QKeyEvent *event) {

if (event->key() » Qt::Key_Space) {

focusNextChildO; } else {

QLineEdit::keyPressEvent(event);

}

}

Этот подход имеет один основной недостаток: если мы используем в форме не­сколько различных видов виджетов (например, QComboBoxes и QSpinBoxes), мы долж­ны также создать их подклассы для обеспечения единообразного поведения. Лучшее решение заключается в перехвате виджетом CustomerlnfoDialog событий нажатия клавиш клавиатуры своих дочерних виджетов и в обеспечении необходимого пове­дения в его программном коде. Это можно сделать при помощи фильтров событий. Настройка фильтров событий сострит из двух этапов;

После регистрации фильтра события те из них, которые посылаются виджётам firstNameEdit, lastNameEdit, cityEdit и phoneNumberEdit, сначала будут переданы функции eventFilter() виджета CustomerlnfoDialog и лишь затем дойдут по своему прямому назначению. (Если для одного объекта установлено несколько фильтров событий, они вызываются по очереди, начиная с установленного последним и после­довательно возвращаясь к первому.)

Ниже приводится функция eventFilte r(), которая перехватывает события:

bool CustomerlnfoDialog::eventFilter(Q0bject *target, QEvent *event) {

if (target == firstNameEdit I| target == lastNameEdit

|| target « cityEdit || target ~= phoneNumberEdit) { if (event->type() *= QEvent::KeyPress) {

QKeyEvent *keyEvent static_cast<QKeyEvent *>(event); if (keyEvent->key() '== Qt::Key_Space) {

focusNextChild(); return true; }


<< назад вперед >>