Qt Как отфильтровать keyPressEvent с автоповторением
Я пытаюсь отфильтровать события нажатия / отпускания клавиш, чтобы можно было установить таймеры для длительных событий нажатия для моего приложения (например, всплывающее меню, когда ошибка нажатия удерживается в течение 3 секунд). У меня возникли проблемы с некоторыми несоответствиями из-за автоповтора QKeyEvent. Вот мой код:
Mainview::Mainview (QWidget *parent) :
QMainWindow (parent)
{
setupUi (this);
qApp->installEventFilter(this); // event filter for key presses
...
}
void Mainview::ControlsPressEvent(QKeyEvent *event)
{
if ((event->isAutoRepeat()))
{
return;
}
QString s = QString("Key PRESS event: %1.").arg(event->text());
qDebug() << s;
}
void Mainview::ControlsReleaseEvent(QKeyEvent *event)
{
if ((event->isAutoRepeat()))
{
return;
}
QString s = QString("Key RELEASE event: %1.").arg(event->text());
qDebug() << s;
}
bool Mainview::eventFilter(QObject *obj, QEvent *event)
{
if (event->type() == QEvent::KeyPress)
{
qDebug() << event << " | " << obj;
/* Only grab the key event from the parent window object */
if (obj->objectName() == "MainviewClassWindow")
{
this->ControlsPressEvent(dynamic_cast<QKeyEvent*>(event));
return true;
}
}
else if (event->type() == QEvent::KeyRelease)
{
qDebug() << event << " | " << obj;
/* Only grab the key event from the parent window object */
if (obj->objectName() == "MainviewClassWindow")
{
this->ControlsReleaseEvent(dynamic_cast<QKeyEvent*>(event));
return true;
}
}
else
{
return QObject::eventFilter(obj, event);
}
return false;
}
Иногда это работает, а иногда нет:
Вот вывод qDebug в рабочем примере, где я нажимаю клавишу один раз, удерживаю и отпускаю:
"Key PRESS event: ."
QKeyEvent(KeyRelease, Key_Down, autorepeat, count=1) | QWidgetWindow(0xa522a0, name = "MainviewClassWindow")
QKeyEvent(KeyPress, Key_Down, autorepeat, count=1) | QWidgetWindow(0xa522a0, name = "MainviewClassWindow")
QKeyEvent(KeyRelease, Key_Down, autorepeat, count=1) | QWidgetWindow(0xa522a0, name = "MainviewClassWindow")
QKeyEvent(KeyPress, Key_Down, autorepeat, count=1) | QWidgetWindow(0xa522a0, name = "MainviewClassWindow")
QKeyEvent(KeyRelease, Key_Down, autorepeat, count=1) | QWidgetWindow(0xa522a0, name = "MainviewClassWindow")
QKeyEvent(KeyPress, Key_Down, autorepeat, count=1) | QWidgetWindow(0xa522a0, name = "MainviewClassWindow")
"Key RELEASE event: ."
Вот вывод qDebug в нерабочем примере, где я нажимаю клавишу один раз, удерживаю и отпускаю:
QKeyEvent(KeyPress, Key_Down) | QWidgetWindow(0xa522a0, name = "MainviewClassWindow")
"Key PRESS event: ."
QKeyEvent(KeyRelease, Key_Down) | QWidgetWindow(0xa522a0, name = "MainviewClassWindow")
"Key RELEASE event: ."
QKeyEvent(KeyPress, Key_Down) | QWidgetWindow(0xa522a0, name = "MainviewClassWindow")
"Key PRESS event: ."
QKeyEvent(KeyRelease, Key_Down) | QWidgetWindow(0xa522a0, name = "MainviewClassWindow")
"Key RELEASE event: ."
QKeyEvent(KeyPress, Key_Down) | QWidgetWindow(0xa522a0, name = "MainviewClassWindow")
"Key PRESS event: ."
QKeyEvent(KeyRelease, Key_Down) | QWidgetWindow(0xa522a0, name = "MainviewClassWindow")
"Key RELEASE event: ."
QKeyEvent(KeyPress, Key_Down) | QWidgetWindow(0xa522a0, name = "MainviewClassWindow")
"Key PRESS event: ."
QKeyEvent(KeyRelease, Key_Down) | QWidgetWindow(0xa522a0, name = "MainviewClassWindow")
"Key RELEASE event: ."
Почему autorepeat
член QKeyEvent несовместим с установленным? Может быть, это неправильный подход к обработке нажатия, удержания и отпускания клавиш?
Спасибо