加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

qt 自定义消息发送机制

(2015-06-28 23:51:57)
标签:

消息队列

分类: Qt
   深夜怒发一帖,总结今天可以说是学到的新知识--------qt自定义消息发送机制,新人上路,如果有不对的地方,还劳烦大神多多指点!
qt信号槽的connect还有c++11标准的lamada表达式也就不说了,现在介绍的是notify

在QApplication类中的一个虚函数:bool notify(QObject* , QEvent* );
自定义一个applicatio类,然后重载notify实现自定义功能:
bool notify(QObject* ob, QEvent* ev)
{
   //这里之所以要判断一下就是为了防止程序结束的时候,
   //这个窗体被销毁这个消息还在传递而导致下面还在获取那个窗口而程序崩溃
    if (this->topLevelWidgets().count() > 0) 
    {
        QWidget* w = this->topLevelWidgets().at(0);
        // 假如我们实现鼠标点击这个窗体的时候打印字符串
        if(ob == (QObject*) w && e->type() == QEvent::MouseButtonPress)
        {
            qDebug() << "this widget is clicked";
        }
    }
    return QApplication::notify(ob, ev);
}

这样,我们点击主窗口的时候就会打印出this widget is clicked

如果我们需要像某个子对象发送消息的时候,我们可以采用下面的方式:
注: app是一个application的对象
app.postEvent(w, ev);
postEvent的函数原型如下:
static void postEvent(QObject *receiver, QEvent *event, int priority = Qt::NormalEventPriority);
其中第一个参数是要发送的对象,而且这个对象的类中必须要实现bool Event(QEvent* )这个函数,其中QEvent*这个参数就是接收的传递过来的消息!
(还有一个sendEvent,两者的区别是send是消息立即处理,而post只是先放到消息队列中,然后一起处理)

第二个参数是要发送的事件, 第三个参数是传递属性有默认值

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有