[Qt] postevent emit

      最近在为bestv做一个播放的plugin,这个plugin主要是在Qt中完成play等功能并能在JavaScript里面进行调用,其中里面就遇到了信息、事件等问题。开始时,我选择通过connect关联singal和slots,再利用emit来触发信息,从而达到执行和回调信息给JavaScript的作用(之所以选择这种,其中一个主要的因素,就是设计plugin类的哥们定义了event处理方式,就是emit方式——从而,我也觉得此种方式可以完成Qt Object 和JSObject的回调等交互与信号传输)。不过,发现此类方式的singal触发时序很难控制并且bestv方在对singal接受部分,并未有完善的方案,最后,只好放弃emit、选择postevent。下面转载、整理、分享了一些来源于网络的Qt-event相关的文档。

------------------------------------------------------------------------------------

Qt中抛消息有:信号和槽、postEvent、sentEvent等机制,sentEvent只支持同步的。postEvent可以实现异步的,其机制是将消息发送到消息队列中,消息队列又会把这些消息都抛出(当然要实现该功能我们也可以用信号和槽机制,将connect函数的最后一个参数设置为Qt::QueuedConnection即可)。

言归正传,上段我们说到消息队列把消息抛出来,我们该如何去捕获该消息呢?我们只要实现父类中的event()或者customEvent()函数即可,在里面实现我们自己的处理,在此建议采用customEvent()。

以下是一个简单的实例:

#include <QWidget>
#include <QEvent>

const QEvent::Type CustomEvent_Login = (QEvent::Type)5001;//建议用5000以上唯一的标识


class PostEvent : public QWidget
{
Q_OBJECT

public:
PostEvent(QWidget *parent = 0);
~PostEvent();

private:
void customEvent(QEvent *e);   //该函数是父类QWidget的虚函数

};

PostEvent::PostEvent(QWidget *parent)
{
QApplication::postEvent(this, new QEvent(CustomEvent_Login));   //该函数实现将自定义的消息发送到队列,且new QEvent(CustomEvent_Login))只能动态分配,原因请看Qt的帮助文档中的postEvent函数说明。
}

void PostEvent::customEvent(QEvent *e)
{
if (e->type() == CustomEvent_Login)   //捕获消息
{
   QMessageBox msgBox;
   msgBox.setText("The document has been modified.");
   msgBox.exec();
}
}

呵呵,就这样吧 本人一开始犯了一个很白痴的错误,即把customEvent函数当作用户可以自定义的函数,殊不知是父类中的虚函数,所以一直捕获不到消息。好了,以上只是一个简单的关于postEvent的一个应用,如果想了解更多的消息机制请阅读其他关于event的文章。
/*
其实对于event的处事方式,最著名的就是两种,一是事件冒泡法(event bubbing),即:事件开始时,由event送至各事件接收方,IE浏览器的研发团队就是采用此方法;另一是事件捕获(event capturing),即事件接收方主动去捕获event。
*/

-------------------------------------------------------------------------------------

qt event 是Qt中最重要的概念之一,是因为Qt程序是典型的事件驱动型, 程序的每个动作都是由幕后某个事件所触发. Qt事件的类型很多, 常见的qt的事件如下:

§          键盘事件: 按键按下和松开.

§          鼠标事件: 鼠标移动,鼠标按键的按下和松开.

§          拖放事件: 用鼠标进行拖放.

§          滚轮事件: 鼠标滚轮滚动.

§          绘屏事件: 重绘屏幕的某些部分.

§          定时事件: 定时器到时.

§          焦点事件: 键盘焦点移动.

§          进入和离开事件: 鼠标移入widget之内,或是移出.

§          移动事件: widget的位置改变.

§          大小改变事件: widget的大小改变.

§          显示和隐藏事件: widget显示和隐藏.

§          窗口事件: 窗口是否为当前窗口.

      Qt 的事件和 Qt 中的 signal 不一样 ,  后者通常用来 
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值