<b>Qt学习之路(23):自定义事件</b>[VC/C++编程]
本文“<b>Qt学习之路(23):自定义事件</b>[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
Qt答应你成立自己的事件范例,这在多线程的程序中特别有效,当然,也可以用在单线程的程序中,作为一种对象间通讯的机制.那么,为什么我需求利用事件,而不是利用信号槽呢?主要缘由是,事件的分发既可以是同步的,又可以是异步的,而函数的调用大概说是槽的回调老是同步的.事件的别的一个好处是,它可以利用过滤器.
Qt中的自定义事件很简单,同其他近似的库的利用很类似,都是要担当一个类举行扩大.在Qt中,你需求担当的类是QEvent.注意,在Qt3中,你需求担当的类是QCustomEvent,不过这个类在Qt4中已经被撤废(这里的撤废是不倡议利用,并非从类库中删除).
担当QEvent类,你需求供应一个QEvent::Type范例的参数,作为自定义事件的范例值.这里的QEvent::Type范例是QEvent里面定义的一个enum,因此,你是可以传送一个int的.重要的是,你的事件范例不能和已经存在的type值反复,不然会有不可意料的错误发生!因为系统会将你的事件当作系统事件举行派发和调用.在Qt中,系统将保存0 - 999的值,也就是说,你的事件type要大于999. 具体来说,你的自定义事件的type要在QEvent::User和QEvent::MaxUser的范围之间.此中,QEvent::User值是 1000,QEvent::MaxUser的值是65535.从这里知道,你最多可以定义64536个事件,相信这个数字已经充足大了!但是,即便如此,也只能保证用户自定义事件不能覆盖系统事件,并不能保证自定义事件之间不会被覆盖.为了办理这个问题,Qt供应了一个函数:registerEventType(),用于自定义事件的注册.该函数签名以下:
static int QEvent::registerEventType ( int hint = -1 );
函数是static的,因此可以利用QEvent类直接调用.函数承受一个int值,其默许值为-1,返回值是成立的这个Type范例的值.假如hint是合理的,不会发生任何覆盖,则会返回这个值;假如hint不合理,系统会自动分配一个合理值并返回.因此,利用这个函数便可完成type值的指定.这个函数是线程安全的,因此没必要别的增添同步.
你可以在QEvent子类中增添自己的事件所需求的数据,然后举行事件的发送.Qt中供应了两种发送方法:
* static bool QCoreApplication::sendEvent(QObjecy * receiver, QEvent * event):事件被QCoreApplication的notify()函数直接发送给receiver对象,返回值是事件处理函数的返回值.利用这个函数必必要在栈上成立对象,比方:
QMouseEvent event(QEvent::MouseButtonPress, pos, 0, 0, 0);
QApplication::sendEvent(mainWindow, &event);
* static bool QCoreApplication::postEvent(QObject * receiver, QEvent * event):事件被QCoreApplication追加到事件列表的最后,并等候处理,该函数将事件追加后会当即返回,并且注意,该函数是线程安全的.别的一点是,利用这个函数必必要在堆上成立对象,比方:
QApplication::postEvent(object, new MyEvent(QEvent::registerEventType(2048)));
这个对象不需求手动delete,Qt会自动delete掉!因此,假如在post事件之后调用delete,程序大概会崩溃.别的,postEvent()函数还有一个重载的版本,增添一个优先级参数,具体请拜见API.通过调用sendPostedEvent()函数可以让已提交的事件当即得处处理.
假如要处理自定义事件,可以重写QObject的customEvent()函数,该函数接纳一个QEvent对象作为参数.注意,在Qt3中这个参数是QCustomEvent范例的.你可以像前面介绍的重写event()函数的办法去重写这个函数:
void CustomWidget::customEvent(QEvent *event) {
CustomEvent *customEvent = static_cast<CustomEvent *>(event);
// ....
}
别的,你也可以通太重写event()函数来处理自定义事件:
bool CustomWidget::event(QEvent *event) {
if (event->type() == MyCustomEventType) {
CustomEvent *myEvent = static_cast<CustomEvent *>(event);
// processing...
return true;
}
return QWidget::event(event);
}
这两种办法都是可行的.
好了,至此,我们已经大要的介绍了Qt的事件机制,包含事件的派发、自定义等一系列的问题.下面的章节将持续我们的学习之路!
出处:http://devbean.blog.51cto.com/448512/232314
以上是“<b>Qt学习之路(23):自定义事件</b>[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |