Qt keyPressEvent не регистрируется при нажатии клавиш W / A / S / D

У меня есть приложение (не относится ни к одной игре, где клавиши W / A / S / D могут иметь особые значения для навигации), где есть QFrame, Я преодолел keyPressEvent() чтобы получить текст, набираемый с клавиатуры, в то время как сосредоточиться на этом QFrame, Это мой код:

void MyFrame::keyPressEvent(QKeyEvent *event)
{
qDebug() << "At least came here" << endl;
QString text = event->text();
qDebug() << "Text: " << text << endl;
}

Когда я набираю символы с клавиатуры по одному, для всех символов и цифр оба оператора записываются правильно. Но для этих четырех ключей ни одна из инструкций журнала не выполняется, то есть обработчик событий даже не запускается. Что случилось?

Изменить: после прохождения примеров, я попытался сформировать минимальный рабочий пример моей ошибки. Это то, что у меня есть. Та же проблема здесь и с этим через фильтр событий. Только для тех четырех символов это не зарегистрировано.

bool MyWidget::eventFilter(QObject *obj, QEvent *event)
{

if (event->type() == QEvent::KeyPress)
{
//this never gets printed
qDebug() << "Phew!" << endl;
return true;

}
if (qobject_cast<ChildWidget *>(obj) != nullptr)
{ChildWidget *option = qobject_cast<ChildWidget *>(obj);
if (event->type() == QEvent::Enter || event->type() == QEvent::MouseMove)
{
//do stuff
return true;
}
if (event->type() == QEvent::Leave)
{
//do stuff
return true;
}
return QWidget::eventFilter(obj, event);
}
else
{
// pass the event on to the parent class
return QWidget::eventFilter(obj, event);
}
}

MyWidget::MyWidget()
{
//do other initialization
this->installEventFilter(this);
}

void MyWidget::keyPressEvent(QKeyEvent *event)
{
qDebug("At least came here");
QString text = event->text();
//this prints out whenever I type any character, excpet W/A/S/D
qDebug() << text;
}

7

Решение

Не уверен, что я что-то неправильно понимаю, но следующий код работает хорошо, и я вижу все ключи в журнале (даже заглавные), кроме ключа «w».

Здесь у вас есть:

Редактирование # 1: установил фильтр событий в QApplication, чтобы получить объекты, которые фильтруют события.

myframe.pro

TEMPLATE = app

QT     += widgets
SOURCES += main.cpp \
myframe.cpp

HEADERS += myframe.h

main.cpp

#include <QtWidgets/QApplication>
#include <QDebug>

#include "myframe.h"
class QApplicationFilter: public QObject
{
public:
QApplicationFilter(): QObject() {};
~QApplicationFilter() {};

bool eventFilter(QObject* obj, QEvent* event)
{
qDebug() << "QApplicationFilter: "<< obj->objectName()
<< " - event type: "<< event->type();
return QObject::eventFilter(obj, event);
};
};

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
a.installEventFilter(new QApplicationFilter());

MyFrame mf;
mf.show();
return a.exec();
}

myframe.h

#ifndef MYFRAME_H
#define MYFRAME_H

#include <QtWidgets/QFrame>

class MyFrame : public QFrame
{
Q_OBJECT

public:
MyFrame();
bool eventFilter(QObject *object, QEvent *event);

protected:
void keyPressEvent(QKeyEvent *event);
};

#endif

myframe.cpp

#include <QDebug>
#include <QKeyEvent>
#include "myframe.h"
MyFrame::MyFrame()
{
this->installEventFilter(this);
}

bool MyFrame::eventFilter(QObject *object, QEvent *event)
{
if (object == this && event->type() == QEvent::KeyPress) {
QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
if (keyEvent->key() == Qt::Key_W) {
return true;
} else {
return false;
}
}
return false;
}

void MyFrame::keyPressEvent(QKeyEvent *event)
{
qDebug("At least came here");
QString text = event->text();
qDebug() << text;
}
3

Другие решения

QFrame Класс выполнен в виде простого каркасного объекта. Он не работает с любым входом по умолчанию. Таким образом, вы должны явно указать политику фокуса, которая позволяет получать события ввода с клавиатуры, используя QWidget::setFocusPolicy() метод. QFrame по умолчанию имеет Qt::NoFocus политика. Попробуйте установить рамки focus policy собственность на Qt::StrongFocus и запустите вашу программу снова.

4

Я нахожу тот факт, что клавиши W, A, S и D являются типичными клавишами перемещения игры, а также клавишами, с которыми у вас возникают проблемы, было очень подозрительным совпадением. Я думаю, у вас есть какая-то «игровая» клавиатура, расширение системы или пользовательский драйвер. Я думаю о таких вещах, как «виртуальный джойстик», «клавиши питания», программное обеспечение для виртуальной реальности, макропрограмма и т. Д. Я был бы более уверен в этом ответе, если бы это не происходило как на Mac, так и на ПК (если только Вы используете ту же клавиатуру или другое оборудование). В любом случае, я бы попробовал другую клавиатуру и запустил систему в безопасном режиме с другими закрытыми программами, просто чтобы убедиться, что эти ключевые события не перехватываются / не изменяются на системном уровне.

2

В качестве первого шага, пожалуйста, сделайте то, что сказал Meefte (приведите минимальный, полный и проверяемый пример «). Посмотрите, какие другие программы запущены. Вы уже проверили, что что-то блокирует это? Попробуйте свой код на другом компьютере или отключите любой инструмент, который вы установлен для вашей клавиатуры. Я думаю, что-то еще блокирует ваш ввод.
С наилучшими пожеланиями

1
По вопросам рекламы [email protected]