Название: KeyPress и KeyRelease - HELP Отправлено: karp2005 от Октябрь 04, 2006, 23:33 Такой код
bool mylclass::eventFilter( QObject *o, QEvent *e ) { if ( e->type() == 6 ) //KeyPress { QKeyEvent *k = (QKeyEvent *)e; ............................... if (k->key() == myBtn) { //некоторые операторы } ................ return TRUE; // eat event } else { // standard event processing return FALSE; } } При удержании клавиши начинают происходить события KeyPress + KeyRelease. Аналогичная ситуация происходит если 6 заменить на 7 (keyrelease) даже если клавишу не отпускать через некоторое время происходит кей релиз, кей прес + кей релиз до тех пор пока клавиша не бутет отпущенна. Используется Qt 3.3.4 Вопрос: как нужно переделать код, чтобы событие нажатие (или отпускание) клавиши происходило один раз даже при её удержании? Если нажать клавишу и не отпускать происходит авто нажатие+отпускание...Как это устранить? Интересует не столько само событие как место "//некоторые операторы" должно выполнятся один раз не смотря на удержание. Так же эта клавиша может быть отпущена и нажата повторно - тогда это место нужно выполнить. Спасибо. Название: KeyPress и KeyRelease - HELP Отправлено: Dendy от Октябрь 05, 2006, 02:56 У QKeyEvent есть такой метод как bool isAutoRepeate(), которьІй возвращает true, если собьІтие бьІло сгенерировано автоматически (без реального повторного нажатия). Тебе нужно смотреть, если етот флаг стоит - пропускать собьІтие, не обрабатьІвать его.
Название: KeyPress и KeyRelease - HELP Отправлено: bigirbis от Октябрь 05, 2006, 08:36 ...И еще, для стандартного процессинга используй:
return QObject::eventFilter( o, e ); Название: KeyPress и KeyRelease - HELP Отправлено: karp2005 от Октябрь 05, 2006, 11:04 Понял, спасибо,
if ( ( k->key() == myBtn )&& (! k->isAutoRepeat ()) ) { } решило проблемму. Название: KeyPress и KeyRelease - HELP Отправлено: Dendy от Октябрь 05, 2006, 12:28 Цитата: "bigirbis" ...И еще, для стандартного процессинга используй: return QObject::eventFilter( o, e ); Етого делать не нужно. Все полезньІе действия вьІнесеньІ из QObject::eventFilter() в метод, его вьІзьІвающий. Нужно просто возвратить false, чтобьІ тот самьІй метод продолжил обработку собьІтия. Большинство виртуальньІх методов Qt сделаньІ правильно - их тела пустьІе. Название: KeyPress и KeyRelease - HELP Отправлено: bigirbis от Октябрь 05, 2006, 13:10 Это листинг из справки по Qt:
Код: bool MainWindow::eventFilter(QObject *obj, QEvent *event) Имелось в виду, что в случае пропуска события, нужно вызвать обработчик базового класса. А QObject::eventFilter ясно, что пустой будет. ...хотя обратно же, QChildEvent? Название: KeyPress и KeyRelease - HELP Отправлено: Dendy от Октябрь 05, 2006, 15:26 :D Ну тогда наверно лучше привьІкать писать:
Код: return __super->eventFilter( object, event ); Хотя, если чесно, мне такой стиль не очень нравится. Наверно, исторически сложилось ;) Прекращаем офтоп (?) Название: KeyPress и KeyRelease - HELP Отправлено: bigirbis от Октябрь 05, 2006, 16:05 Последний пост в ОФФТОП: я имел в виду явный вызов eventFilter для родительского класса.
|