Russian Qt Forum
Сентябрь 29, 2024, 14:31 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: KeyPress и KeyRelease - HELP  (Прочитано 5860 раз)
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
 
Вопрос:

как нужно переделать код, чтобы событие нажатие (или отпускание) клавиши происходило один раз даже при её удержании? Если нажать клавишу и не отпускать происходит авто нажатие+отпускание...Как это устранить? Интересует не столько само событие как место "//некоторые операторы" должно выполнятся один раз не смотря на удержание. Так же эта клавиша может быть отпущена и нажата повторно - тогда это место нужно выполнить.
Спасибо.
Записан
Dendy
Гость
« Ответ #1 : Октябрь 05, 2006, 02:56 »

У QKeyEvent есть такой метод как bool isAutoRepeate(), которьІй возвращает true, если собьІтие бьІло сгенерировано автоматически (без реального повторного нажатия). Тебе нужно смотреть, если етот флаг стоит - пропускать собьІтие, не обрабатьІвать его.
Записан
bigirbis
Гость
« Ответ #2 : Октябрь 05, 2006, 08:36 »

...И еще, для стандартного процессинга используй:
return QObject::eventFilter( o, e );
Записан
karp2005
Гость
« Ответ #3 : Октябрь 05, 2006, 11:04 »

Понял, спасибо,

if ( ( k->key() ==  myBtn )&& (! k->isAutoRepeat ()) )
{ }

решило проблемму.
Записан
Dendy
Гость
« Ответ #4 : Октябрь 05, 2006, 12:28 »

Цитата: "bigirbis"
...И еще, для стандартного процессинга используй:
return QObject::eventFilter( o, e );


Етого делать не нужно. Все полезньІе действия вьІнесеньІ из QObject::eventFilter() в метод, его вьІзьІвающий. Нужно просто возвратить false, чтобьІ тот самьІй метод продолжил обработку собьІтия. Большинство виртуальньІх методов Qt сделаньІ правильно - их тела пустьІе.
Записан
bigirbis
Гость
« Ответ #5 : Октябрь 05, 2006, 13:10 »

Это листинг из справки по Qt:
Код:
    bool MainWindow::eventFilter(QObject *obj, QEvent *event)
    {
        if (obj == textEdit) {
            if (event->type() == QEvent::KeyPress) {
                QKeyEvent *keyEvent = static_cast<QKeyEvent*>(event);
                qDebug() << "Ate key press" << keyEvent->key();
                return true;
            } else {
                return false;
            }
        } else {
            // pass the event on to the parent class
            return QMainWindow::eventFilter(obj, event);
        }
    }

Имелось в виду, что в случае пропуска события, нужно вызвать обработчик базового класса. А QObject::eventFilter ясно, что пустой будет. ...хотя обратно же, QChildEvent?
Записан
Dendy
Гость
« Ответ #6 : Октябрь 05, 2006, 15:26 »

Веселый  Ну тогда наверно лучше привьІкать писать:

Код:
return __super->eventFilter( object, event );


Хотя, если чесно, мне такой стиль не очень нравится. Наверно, исторически сложилось Подмигивающий

Прекращаем офтоп (?)
Записан
bigirbis
Гость
« Ответ #7 : Октябрь 05, 2006, 16:05 »

Последний пост в ОФФТОП: я имел в виду явный вызов eventFilter для родительского класса.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.105 секунд. Запросов: 20.