QT6

5、消息过滤、消息通知与自定义消息

5.1消息过滤

       我们想截取一个button的左键点击事件,方法如下:

1、 先button给自己安装一个过滤器

m_button->installEventFilter(this);

这个设置的意思是button将this(这里是一个窗口)这个对象设置为自己的消息过滤器,那么所有经过button的消息都要先经过这个过滤器的eventFilter()函数。

如果没有过滤器要截取button的点击消息,则需要派生一个button的子类,在这个子类中调用event()函数进行截取。因为每个对象要处理的消息不一样,如果每个对象为了过滤某个消息就要派生一个新的类出来,不管是从工作量还是程序设计等角度来说都是不方便的。

比较简单的方法是这些对象都安装一个消息过滤器,这样每次消息来的时候都会先经过过滤器,将不需要的消息直接过滤掉就好。

       2、重载过滤器的eventFilter()函数    

booleventFilter(QObject*,QEvent*);

boolMyWidget::eventFilter(QObject*obj,QEvent*ev)

{

    if(obj==(QObject*)m_button&&ev->type()==QEvent::MouseButtonPress)

    {

        returntrue;

    }

    returnQWidget::eventFilter(obj,ev);

}

 

5.2消息通知notify()

boolnotify(QObject*,QEvent*)Q_DECL_OVERRIDE;

       notify函数是QApplication的成员函数,窗口会向应用程序通知正在处理的消息,通过这个函数,应用程序可以知道各个窗口当前要处理的消息。可以派生一个QApplication类,重载这个函数,获取程序当前正在处理的消息。

      

classMyApplication:publicQApplication

{

    Q_OBJECT

public:

    MyApplication(intargc,char**argv):QApplication(argc,argv)

    {}

 

    boolnotify(QObject*,QEvent*);

signals:

 

publicslots:

 

private:

};

boolMyApplication::notify(QObject*obj,QEvent*ev)

{

 

    //if(obj==主窗口&&ev==左键)

    //{

        //do...

    //}

    if(this->topLevelWidgets().count()>0)

    {

        QWidget*mainWnd=this->topLevelWidgets().at(0);

 

        if(obj==(QObject*)mainWnd&&ev->type()==QEvent::MouseButtonPress)

        {

            qDebug()<<"mainwdisclicked";

        }

    }

    returnQApplication::notify(obj,ev);

}

5.3自定义消息

       5.3.1应用程序向指定对象发送消息

一个对象可以发消息给另一个对象。

       在QEvent中已经定义了很多消息:

      

可以看出从1000开始到65535是用户自定义消息的范围,理论上用户可以自定义64535个消息。

QApplication有postEvent和sendEvent用于发送消息

发送消息:

app.postEvent(&w,newQEvent(QEvent::MyUser));

app.sendEvent(&w,newQEvent(QEvent::MyUser));

消息可以发送给任何QObject对象,post和send发送消息是有区别的,post是立马返回,是非阻塞的,send必须要等消息发完才返回,是阻塞的。

自定义消息没有虚函数可以重载,所以只能在event()函数中进行处理

boolMyWidget::event(QEvent*ev)

{

    if(ev->type()==QEvent::MyUser)

    {

        qDebug()<<"Usereventiscoming";

    }

}

       5.3.1一个对象向另一个对象发送消息

       QApplication类有一个全局的对象指针:qApp,这个指针和main函数中我们定义的app是一个对象。所以我们可以在一个对象的构造函数或者成员函数中调用qApp的pos方法发送消息给指定的对象。

qApp->postEvent(this,newQEvent(QEvent::MyUser));

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
为了使更多的Qt初学者能尽快入门Qt,也为了QtQt Creator的快速普及,我们花费大量精力写出了这一系列教程。虽然教程的知识可能很浅显,虽然教程的语言可能不规范,但是它却被数十万网友所认可。我们会将这一系列教程一直写下去,它将涉及Qt的方方面面 一、Qt Creator的安装和hello world程序的编写 二、Qt Creator编写多窗口程序 三、Qt Creator登录对话框 四、Qt Creator添加菜单图标 五、Qt Creator布局管理器的使用 六、Qt Creator实现文本编辑 七、Qt Creator实现文本查找 八、Qt Creator实现状态栏显示 九、Qt Creator鼠标键盘事件的处理实现自定义鼠标指针 十、Qt Creator实现定时器和产生随机数 十一、Qt 2D绘图(一)绘制简单图形 十二、Qt 2D绘图(二)渐变填充 十三、Qt 2D绘图(三)绘制文字 十四、Qt 2D绘图(四)绘制路径 十五、Qt 2D绘图(五)显示图片 十六、Qt 2D绘图(六)坐标系统 十七、Qt 2D绘图(七)Qt坐标系统深入 十八、Qt 2D绘图(八)涂鸦板 十九、Qt 2D绘图(九)双缓冲绘图简介 二十、Qt 2D绘图(十)图形视图框架简介 二十一、Qt数据库(一)简介 二十二、Qt数据库(二)添加MySQL数据库驱动插件 二十三、Qt数据库(三)利用QSqlQuery类执行SQL语句(一) 二十四、Qt数据库(四)利用QSqlQuery类执行SQL语句(二) 二十五、Qt数据库(五)QSqlQueryModel 二十六、Qt数据库(六)QSqlTableModel 二十七、Qt数据库(七)QSqlRelationalTableModel 二十八、Qt数据库(八)XML(一) 二十九、Qt数据库(九)XML(二) 三十、Qt数据库(十)XML(三) 三十一、Qt 4.7.0及Qt Creator 2.0 beta版安装全程图解 三十二、第一个Qt Quick程序(QML程序) 三十三、体验QML演示程序 三十四、Qt Quick Designer介绍 三十五、QML组件 三十六、QML项目之Image和BorderImage 三十七、Flipable、Flickable和状态与动画 三十八、QML视图 三十九、QtDeclarative模块 四十、使用Nokia Qt SDK开发Symbian和Maemo终端软件 四十一、Qt网络(一)简介 四十二、Qt网络(二)HTTP编程 四十三、Qt网络(三)FTP(一) 四十四、Qt网络(四)FTP(二) 四十五、Qt网络(五)获取本机网络信息 四十六、Qt网络(六)UDP 四十七、Qt网络(七)TCP(一) 四十八、Qt网络(八)TCP(二)

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值