作者:魏知染纪 | 来源:互联网 | 2022-12-06 19:40
这是我在这里关于Qt的第一个问题(通常是互联网和doc帮我很多)
我已经安装了eventfilter我的应用程序(在main.cpp中),我想这个事件过滤器来检查按下然后重新分配,以降低功能(就像在一个QGraphicsScene移动的项目)的关键,
这是工作但是5次..过滤器中的qDebug()告诉我,当它只有一个时按下键5次.
事件过滤器速度非常快,可以捕获5次.无法找到去辩解的方法.
这是代码的有趣部分:
main.cpp中
#include "mainwindow.h"
#include "eventfilter.h"
#include
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
xEventFilter *filter = new xEventFilter(&a);
a.installEventFilter(filter);
xMainWindow w;
w.show();
return a.exec();
}
eventfilter.h
#ifndef EVENTFILTER_H
#define EVENTFILTER_H
#include
class xEventFilter : public QObject
{
Q_OBJECT
public:
explicit xEventFilter(QObject *parent = nullptr);
protected:
bool eventFilter(QObject *obj, QEvent *event) override;
};
#endif // EVENTFILTER_H
eventfilter.cpp
#include "eventfilter.h"
#include "editor.h"
#include
#include
extern xEditor *editor;
xEventFilter::xEventFilter(QObject *parent) :
QObject(parent)
{ }
bool xEventFilter::eventFilter(QObject *obj, QEvent *event)
{
qDebug() <<"Enter filter";
if (event->type() != QEvent::KeyPress)
return QObject::eventFilter(obj, event);
QKeyEvent *keyEvent = static_cast(event);
qDebug() <text();
switch(keyEvent->key()) {
case Qt::Key_Z: { editor->selection->moveSelection(keyEvent); }
case Qt::Key_S: { editor->selection->moveSelection(keyEvent); }
case Qt::Key_Q: { editor->selection->moveSelection(keyEvent); }
case Qt::Key_D: { editor->selection->moveSelection(keyEvent); }
case Qt::Key_Space: { }
}
return false;
}
仰视你的答案;)
1> Jaa-c..:
主要问题是即使您处理事件,也会返回false.根据文档,如果您希望停止处理事件,则应返回true.
在重新实现此函数时,如果要过滤掉事件,即停止进一步处理,则返回true; 否则返回false.
此外,break
在switch语句的情况下,您将丢失.