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;
}

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

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

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;
}

4 ответов


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

у вас есть:

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

мой кадр.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;
}

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


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


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