• Qt EventFilter 事件过滤器 及传递 鼠标键盘事件捕捉


    1. Qt QObject EventFilter  API

    1. // 安装捕捉事件过虑器
    2. void QObject::installEventFilter(QObject *filterObj);
    3. // 反安装捕捉事件过虑器
    4. void QObject::removeEventFilter(QObject *obj);
    5. // 进行事件监听
    6. bool eventFilter(QObject *obj, QEvent *event);

    2. Qt QObject EventFilter 基本使用方法如下:

    如果对象使用installEventFilter()函数注册了事件过滤器;
    目标对象中的所有事件将首先发给这个监视对象的eventFilter()函数。

    eventFilter()函数返回true,则取消事件(事件不再向目标对象发送),

    返回false,则事件被继续发往目标对象。

    事件过滤器可以是任何从QObject继承的对象,只要实现eventFilter()这个函数。
    如果同一object安装了多个event filter, filter将从最近安装的到第一个依次激活。
    因此,设置一个event filter有两个步骤:
    (1) 在目标对象上调用installEventFilter(),将监测对象注册到目标对象上。
    (2)在监测对象的eventFilter()方法里处理目标对象的事件。

    3.全局捕捉键盘,及鼠标事件

    1. //override eventFilter
    2. bool eventFilter(QObject *object, QEvent *e) override;
    3. // install
    4. QApplication::instance()->installEventFilter(this);
    5. // monitor
    6. bool MainWindow::eventFilter(QObject *object, QEvent *e)
    7. {
    8. return QObject::eventFilter(object, e);
    9. }

    all code

    mainWindow.h

    1. #ifndef MAINWINDOW_H
    2. #define MAINWINDOW_H
    3. #include
    4. namespace Ui {
    5. class MainWindow;
    6. }
    7. class MainWindow : public QMainWindow
    8. {
    9. Q_OBJECT
    10. public:
    11. explicit MainWindow(QWidget *parent = nullptr);
    12. ~MainWindow();
    13. bool eventFilter(QObject *object, QEvent *e) override;
    14. private:
    15. Ui::MainWindow *ui;
    16. };
    17. #endif // MAINWINDOW_H

    mainWindow.cpp

    1. #include "mainwindow.h"
    2. #include "ui_mainwindow.h"
    3. #include
    4. MainWindow::MainWindow(QWidget *parent) :
    5. QMainWindow(parent),
    6. ui(new Ui::MainWindow)
    7. {
    8. ui->setupUi(this);
    9. QApplication::instance()->installEventFilter(this);
    10. }
    11. MainWindow::~MainWindow()
    12. {
    13. delete ui;
    14. }
    15. bool MainWindow::eventFilter(QObject *object, QEvent *e)
    16. {
    17. if (e->type() == QEvent::KeyPress && ((QKeyEvent*)e)->key()
    18. == Qt::Key_Space)
    19. {
    20. qDebug()<<"Key_Space KeyPress";
    21. return true; // no di
    22. }
    23. if (e->type() == QEvent::KeyRelease && ((QKeyEvent*)e)->key()
    24. == Qt::Key_Space)
    25. {
    26. qDebug()<<"Key_Space release";
    27. return true; // no di
    28. }
    29. //mouse Enter label show plainTextEdit,Leave hide plainTextEdit
    30. if (object == (QObject*)ui->label)
    31. {
    32. if (event->type() == QEvent::Enter)
    33. {
    34. ui->plainTextEdit->setVisible(true);
    35. }
    36. else if(event->type() == QEvent::Leave)
    37. {
    38. ui->plainTextEdit->setVisible(false);
    39. }
    40. return false;
    41. }
    42. return QObject::eventFilter(object, e);
    43. }

    print out

    1. Key_Space KeyPress
    2. Key_Space release

     

  • 相关阅读:
    基于身份的分段:三种技术路线解析与建议
    【GPU】Nvidia CUDA 编程高级教程——利用蒙特卡罗法求解近似值(CUDA-Aware MPI)
    Unregistering JMX-exposed beans on shutdown
    基于LLMs的多模态大模型(Visual ChatGPT,PICa,MM-REACT,MAGIC)
    左旋肉碱除铁,左旋肉碱铁离子超标怎么解决?
    【单片机】18-红外线遥控
    八种架构设计模式优缺点
    Address already in dse_JVM_Bind。端口莫名被占用【占用8080端口!!!】
    kubernetes集群最新版安装
    Operator介绍
  • 原文地址:https://blog.csdn.net/q610098308/article/details/126302939