按下 W/A/S/D 键时 Qt keyPressEvent 未注册
Qt keyPressEvent not registering when W/A/S/D keys are pressed
我有一个应用程序(与 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;
}
当我从键盘一次输入一个字符时,对于所有字符和数字,两个语句都被正确记录。但是对于这四个键,日志语句都没有执行,即事件处理程序甚至没有触发。怎么了?
编辑:看完这些例子后,我试图为我的 bug 构建一个最小的工作示例。这就是我所拥有的。同样的问题在这里以及通过事件过滤器来完成。只有这四个字符没有记录。
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;
}
QFrame
class 被设计成一个简单的框架对象。默认情况下它不适用于任何输入。因此,您必须明确指定一个焦点策略,允许使用 QWidget::setFocusPolicy()
方法检索键盘输入事件。 QFrame
默认有 Qt::NoFocus
政策。尝试将框架的 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();
}
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;
}
首先请按照 Meefte 所说的去做(提供一个最小的、完整的和可验证的例子)。然后看看你的其他程序 运行。你是否已经检查过是否有东西阻止了它?试试你的在另一台计算机上编写代码或停用您为键盘安装的任何工具。我猜其他东西会阻止您的输入。
最好的问候
我发现 W、A、S 和 D 键是典型的游戏移动键,也是您遇到问题的键,这是一个非常可疑的巧合。我最好的猜测是你有某种 "gaming" 键盘、系统扩展或自定义驱动程序。我正在考虑 "virtual joystick"、"power keys"、VR 软件、宏软件等。如果 Mac 和 PC(除非您使用相同的键盘或其他硬件)。无论哪种方式,我都会尝试使用另一个键盘并在关闭其他程序的情况下以安全模式启动系统,以确保这些关键事件不会在系统级别 intercepted/modified。
我有一个应用程序(与 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;
}
当我从键盘一次输入一个字符时,对于所有字符和数字,两个语句都被正确记录。但是对于这四个键,日志语句都没有执行,即事件处理程序甚至没有触发。怎么了?
编辑:看完这些例子后,我试图为我的 bug 构建一个最小的工作示例。这就是我所拥有的。同样的问题在这里以及通过事件过滤器来完成。只有这四个字符没有记录。
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;
}
QFrame
class 被设计成一个简单的框架对象。默认情况下它不适用于任何输入。因此,您必须明确指定一个焦点策略,允许使用 QWidget::setFocusPolicy()
方法检索键盘输入事件。 QFrame
默认有 Qt::NoFocus
政策。尝试将框架的 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();
}
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;
}
首先请按照 Meefte 所说的去做(提供一个最小的、完整的和可验证的例子)。然后看看你的其他程序 运行。你是否已经检查过是否有东西阻止了它?试试你的在另一台计算机上编写代码或停用您为键盘安装的任何工具。我猜其他东西会阻止您的输入。 最好的问候
我发现 W、A、S 和 D 键是典型的游戏移动键,也是您遇到问题的键,这是一个非常可疑的巧合。我最好的猜测是你有某种 "gaming" 键盘、系统扩展或自定义驱动程序。我正在考虑 "virtual joystick"、"power keys"、VR 软件、宏软件等。如果 Mac 和 PC(除非您使用相同的键盘或其他硬件)。无论哪种方式,我都会尝试使用另一个键盘并在关闭其他程序的情况下以安全模式启动系统,以确保这些关键事件不会在系统级别 intercepted/modified。