7

我有一个应用程序(与 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;
}
4

4 回答 4

4

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

于 2015-07-27T09:06:59.713 回答
3

不确定我是否误解了某些东西,但以下代码运行良好,我看到日志中的所有键(甚至大写),除了键“w”。

在这里你有:

Edit#1:在 QApplication 上安装了一个事件过滤器来获取过滤事件的对象。

myframe.pro

TEMPLATE = app

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

HEADERS += myframe.h 

主文件

#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();
}

我的框架.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

我的框架.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;
}
于 2015-07-27T09:31:26.460 回答
2

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

于 2015-08-01T12:35:51.023 回答
1

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

于 2015-07-27T10:34:30.820 回答