小工具知识网

当前位置: 首页 > 行业知识 > 【QT】事件分发器/事件过滤器/事件处理的介绍和使用

行业知识

【QT】事件分发器/事件过滤器/事件处理的介绍和使用

2026-11-15 01:17:43 来源:互联网转载

事件分发函数 event()

事件分发器:返回值 bool

如果返回时true,代表用户要处理事件,不再分发事件了。

  • 事件对象创建完毕后,Qt 将这个事件对象传递给QObject的event()函数。
  • event()函数并不直接处理事件,而是将这些事件对象按照它们不同的类型,分发给不同的事件处理(eventhandler)。

    因此如上所述,event()函数主要用于事件的分发。所以,如果你希望在事件分发之前做一些操作,就可以重写这个event()函数了。

    event事件

    #include 
    • 用途:用于事件的分发
    • 也可以用作拦截事件(不建议)

      例如,我们希望在一个QWidget组件中监听 tab 键的按下,那么就可以继承QWidget,并重写它的event()函数,来达到这个目的

      //事件分发器bool mylabel::event(QEvent *e){    if(e->type() == QEvent::KeyPress)    {       静态类型转换        QKeyEvent *keyEvent = static_cast(e);        if(keyEvent->key()==Qt::Key_Tab)        {            qDebug() //如果键盘按下,在event事件分发中做拦截操作    if(e-type() == QEvent::MouseButtonPress)    {        //静态类型转换         QMouseEvent *ev = static_castx()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());         qDebug()installEventFilter(this). 
      • 发送到obj的所有事件, 都会先发送到filterObject的eventFilter()方法,
      • 即filterObject会过滤obj的事件, 这样就不用为了实现一个事件而要去继承, 再实现一个类, 完成如mouse event, key event等了, 只用在当前类中就可以通过事件过滤来完成.

        在程序将事件分发到事件分发器前,可以利用过滤器拦截

        1.给控件安装事件过滤器

        2.重写eventFilter函数(obj,sv)

        public:    explicit Event(QWidget *parent = nullptr);    ~Event();    //重写事件过滤器事件    bool eventFilter(QObject*obj,QEvent*e);
        #include "event.h"#include "ui_event.h"#include #include #include Event::Event(QWidget *parent) :    QWidget(parent),    ui(new Ui::Event){    ui->setupUi(this);    //步骤一安装事件过滤器    ui->label->installEventFilter(this);    //步骤2L重写eventfilter事件} bool Event::eventFilter(QObject*obj,QEvent*e) {     if(obj == ui->label)     {     if(e->type() == QEvent::MouseButtonPress)     {         //静态类型转换          QMouseEvent *ev  = dynamic_cast(e);//会做类型检查,相对安全,但是带来的成本高于static_cast         //QMouseEvent *ev = static_cast(e);          QString str = QString("EventFilter函数中,鼠标按下了 x = %1,y=%2 globalX =%3 globalY = %4").arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());          qDebug()    delete ui;}     if (maybeSave())                        //如果还有需要保存的数据    {         writeSettings();         event-accept();    }      else                                    //取消关闭窗口    {         event-ignore();    } }

        类似的还有**keyEvent()**获取键盘事件函数, **keyReleaseEvent()**键盘按下事件函数,enterEvent光标进入组件事件函数, leaveEvent光标离开组件事件函数等等。

        其中QCloseEvent继承与QEvent,在QEvent中常用成员函数有

        void  accept ();    //接收者处理当前事件void  ignore ();    //接收者忽略当前事件,忽略后,事件可能传递给父组件bool isAccepted();  //判断当前事件是否被

上一篇:APP源码破解,危险行为触碰法律底线

下一篇:ECShop域名轻松更换教程,一步步带你玩转新域名设置!