Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: karp2005 от Октябрь 04, 2006, 23:33



Название: 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)
    {
        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?


Название: KeyPress и KeyRelease - HELP
Отправлено: Dendy от Октябрь 05, 2006, 15:26
:D  Ну тогда наверно лучше привьІкать писать:

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


Хотя, если чесно, мне такой стиль не очень нравится. Наверно, исторически сложилось ;)

Прекращаем офтоп (?)


Название: KeyPress и KeyRelease - HELP
Отправлено: bigirbis от Октябрь 05, 2006, 16:05
Последний пост в ОФФТОП: я имел в виду явный вызов eventFilter для родительского класса.