C++ 按W/A/S/D键时未注册Qt KeyPress事件

C++ 按W/A/S/D键时未注册Qt KeyPress事件,c++,qt,keypress,qevent,qkeyevent,C++,Qt,Keypress,Qevent,Qkeyevent,我有一个应用程序(与任何W/A/S/D键可能对导航有特殊意义的游戏无关),其中有一个QFrame。我重写了keyPressEvent()以获得通过键盘键入的文本,同时专注于QFrame。这是我的代码: void MyFrame::keyPressEvent(QKeyEvent *event) { qDebug() << "At least came here" << endl; QString text = event->text(); qD

我有一个应用程序(与任何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;
}
void MyFrame::keyPressEvent(QKeyEvent*event)
{
qDebug()文本();
//每当我输入任何字符时,都会打印出来,不包括W/A/S/D

qDebug()
QFrame
类被设计为一个简单的框架对象。默认情况下,它不适用于任何输入。因此,您必须明确指定一个焦点策略,该策略允许使用
QWidget::setFocusPolicy()检索键盘输入事件
方法。
QFrame
默认情况下具有
Qt::NoFocus
策略。尝试将frame的
focus policy
属性设置为
Qt::StrongFocus
,然后再次启动程序。

不确定我是否误解了某些内容,但以下代码运行良好,我在日志中看到了所有键(甚至大写)除键“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();
}
#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;
}
#包括
#包括
#包括“myframe.h”
类QApplicationFilter:公共QObject
{
公众:
QApplicationFilter():QObject(){};
~QApplicationFilter(){};
布尔事件过滤器(QObject*obj,QEvent*event)
{
qDebug()类型()==QEvent::KeyPress){
QKeyEvent*keyEvent=静态广播(事件);
如果(keyEvent->key()==Qt::key\u W){
返回true;
}否则{
返回false;
}
}
返回false;
}
void MyFrame::keyPressEvent(QKeyEvent*事件)
{
qDebug(“至少来过这里”);
QString text=事件->文本();

qDebug()首先请按照Meefte所说的去做(提供一个最小的、完整的、可验证的示例)。然后看看您运行的其他程序。您是否已经准备好检查有什么东西阻止了它?在另一台计算机上尝试您的代码或停用您为键盘安装的任何工具。我想还有什么东西阻止了您的输入。
致以最诚挚的问候

我发现W、A、S和D键是典型的游戏移动键,也是您遇到问题的键,这是一个非常可疑的巧合。我最好的猜测是您有某种“游戏”键盘、系统扩展或自定义驱动程序。我正在考虑“虚拟操纵杆”、“电源键”之类的东西“、VR软件、宏软件等。如果Mac和PC上都没有出现这种情况(除非使用相同的键盘或其他硬件),我会对这个答案更有信心。”。无论哪种方式,我都会尝试另一个键盘,并在其他程序关闭的情况下以安全模式启动系统,以确保这些关键事件不会在系统级别被拦截/修改。

您是否检查过此事件未在其他地方处理?例如包含MyFrame的父小部件抢占进程?不,没有这种情况。是否存在可能是在另一个应用程序中定义了某个全局热键?当foobar的热键截获Mine时,我也遇到过类似的情况。我不这么认为,因为我在不同的机器上测试了该应用程序,包括Mac和Windows。同样的问题。它适用于除这四个键之外的所有键,所以我猜焦点策略不是问题。但我已经检查过,我们没有发现任何地方有问题禁止任何操作,以免接受这四个键。在我的回答中,我使用了一个
QFrame
,我没有设置它的
焦点策略
,键盘输入事件被接收。@Tarod这是因为事件过滤器。它无论如何都会接收事件。我的回答补充了覆盖
keyPressEvent
的问题示例。是的,它可以工作它无处不在,但不在我的应用程序中。我彻底检查了(尽管看起来不够彻底),没有任何地方可以禁用这4个字符的任何输入。我知道拦截事件的唯一方法是使用
bool QObject::eventFilter(QObject*watched,QEvent*event)
。我已经更新了代码,所以现在应用程序不处理“w”键。你的应用程序中安装了事件过滤器吗?@Cupidvogel谢谢。我复制并粘贴了你的代码,通过
MyFrame
更改
ChildWidget
,以便正确编译,我看到了“呸!”对于我按的所有键。顺便说一句,如果您想在
keyPressEvent
方法中获取该键,您应该返回
false
。请向我们显示您的头文件?或者至少,该示例代码的头文件不起作用。它仍然不起作用。我想问题在于我们的代码库(这是巨大的,我不可能复制它的缩小版本!),我们正在处理这四个键。@Cupidvogel也许在QApplication上安装一个事件过滤器可以帮助您找到“正在吃”的对象这些事件。请查看新的编辑。是的,当我发现只有这四个键不起作用时,我怀疑是相同的。但是,我已经在许多系统中尝试过,包括Windows和Mac,都有相同的问题..:(它们都是你的系统吗?也许你正在所有系统上安装一个通用程序/驱动程序?不,我在我的Mac电脑和其他一些Mac电脑上进行了尝试。然后我在2或3台Windows笔记本电脑上进行了尝试。到处都有相同的问题……:(
#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
#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;
}