最近在为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 不一样 , 后者通常用来