在Qt中反跳事件过滤器

时间:2018-08-23 09:01:56

标签: c++ qt c++11

这是我关于Qt的第一个问题(通常互联网和文档对我有很大帮助)

我已经在我的应用程序(位于main.cpp中)上安装了一个事件过滤器,并且希望该事件过滤器检查按下的键,然后将其重新分配给较低的功能(例如在QGraphicsScene上移动项目),

这是有效的,但是5次。 过滤器中的qDebug()向我显示该键只有一个时被按下了5次。

事件过滤器是如此之快,它捕获了5次。 无法找到一种方法来消除这种情况。

这是代码中有趣的部分:

main.cpp

#include "mainwindow.h"
#include "eventfilter.h"

#include <QApplication>

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 <QObject>

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 <QKeyEvent>
#include <QDebug>

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<QKeyEvent *>(event);

    qDebug() << keyEvent->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 个答案:

答案 0 :(得分:5)

主要问题是,即使处理该事件,您也会返回false。根据{{​​3}},如果您想停止处理事件,则应返回true。

  

在重新实现此功能时,如果要过滤   事件结束,即停止进一步处理,返回true;除此以外   返回false。

此外,在您使用switch语句时,您还会缺少sr.No Company Name Technology Job Title Total Score Average Score 1 abc cdhcd cdhh 12 89 ---> multiple rows like this --> YesterDay's Score 60 89