Qt 中的去抖动事件过滤器

Posted

技术标签:

【中文标题】Qt 中的去抖动事件过滤器【英文标题】:Debounce event filter in Qt 【发布时间】:2018-08-23 09:01:56 【问题描述】:

这是我关于 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;

期待您的回答;)

【问题讨论】:

您的案例中缺少break; 你的代码没有编译(一些文件丢失),你应该创建一个MCVE,见***.com/help/mcve 是的,只是显示了所需的文件,下次使用您的链接会做得更好 【参考方案1】:

主要问题是即使你处理了事件,你也会返回 false。根据documentation,如果您希望停止处理该事件,您应该返回 true。

在你重新实现这个函数时,如果你想过滤 事件输出,即停止进一步处理,返回true;除此以外 返回 false。

此外,在您的 switch 语句中,您缺少 break

【讨论】:

嗯,错过了,我觉得很笨,返回 true 解决了问题,是的,休息很有用!

以上是关于Qt 中的去抖动事件过滤器的主要内容,如果未能解决你的问题,请参考以下文章

17.QT-事件处理分析事件过滤器拖放事件

Angular6 ngModelChange 中的去抖动时间

事件过滤器未捕获 Qt 鼠标移动事件

qt源码解析1--事件循环原理(重写事件函数,事件过滤器等)

qt5---事件过滤器

Qt怎样使用事件过滤器