您现在的位置是:网站首页> C/C++

Qt6 C++基础入门4 事件处理与eventFilter检测

  • C/C++
  • 2023-07-22
  • 684人已阅读
摘要

事件处理

覆写指定事件实现检测

QObject 为我们提供了丰富的关于鼠标、键盘等事件的检测,我们仅需要对其覆写即可实现检测效果


代码清单:widget.h


protected:

    // 覆写按键点击事件

    void keyPressEvent(QKeyEvent *event);


之后来到主文件 widget.cpp,直接覆写对应的时间即可


// 覆写按键点击事件

void Widget::keyPressEvent(QKeyEvent *event)

{

    // 检测按下alt和x键

    if(event->modifiers()==Qt::AltModifier && event->key()==Qt::Key_X){

        qDebug() << "press key alt m";

    }else{

        // 检测不到,就一直检测

        QWidget::keyPressEvent(event);

    }

}



eventFilter 按键检测

eventFilter 可以实现让一个对象监听另一个对象的所有事件,我们只需要在对应的函数中对截取到的事件进行过滤后处理对应事件即可


我们接下来实现这样的效果:在 widget 主窗口点击 ctrl+m,然后调试输出一段文本


首先在头文件 Widget.h 定义一下虚函数 eventFilter


...


class Widget : public QWidget

{

    Q_OBJECT


protected:

    // 添加虚函数,注意尾部的override对其进行覆写,否则无法使用!

    bool eventFilter(QObject *watched, QEvent *event) override;


...

};

#endif // WIDGET_H


紧接着进入主文件 Widget.cpp


由于我们需要监听整个 widget,所以在主构造函数里面使用 installEventFilter 装载监听器,监听对象就是自己 this


Widget::Widget(QWidget *parent)

    : QWidget(parent)

    , ui(new Ui::Widget)

{

    ui->setupUi(this);


    // 装载监听器,监听对象就是自己

    installEventFilter(this);

}


之后就是对应的事件过滤函数,我们需要对其进行覆写


bool Widget::eventFilter(QObject *obj, QEvent *event)

{

    // 如果事件类型为键盘点击事件

    if (event->type() == QEvent::KeyPress) {

        // 强制转换事件类型为键盘点击事件

        QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);

        // 如果同时按下ctrl与m键

        if (keyEvent->modifiers()==Qt::ControlModifier && keyEvent->key() == Qt::Key_M) {

            // 输出一段调试文本

            qDebug() << "M key pressed";

        }

    }

    // 最后返回事件作为结尾

    return QWidget::eventFilter(obj, event);

}


完整代码 Widget.cpp


#include "Widget.h"

#include "ui_Widget.h"

#include "QKeyEvent"


Widget::Widget(QWidget *parent)

    : QWidget(parent)

    , ui(new Ui::Widget)

{

    ui->setupUi(this);


    installEventFilter(this);

}


Widget::~Widget()

{

    delete ui;

}


bool Widget::eventFilter(QObject *obj, QEvent *event)

{

    if (event->type() == QEvent::KeyPress) {

        QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);

        if (keyEvent->modifiers()==Qt::ControlModifier && keyEvent->key() == Qt::Key_M) {

           qDebug() << "M key pressed";

        }

    }

    return QWidget::eventFilter(obj, event);

}


Top