当前位置:七道奇文章资讯编程技术VC/C++编程
日期:2011-03-22 13:54:00  来源:本站整理

<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++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
  • <b>hosts是什么 hosts文件在什么位置 若何改正hosts</b>
  • <b>在 Windows 8 中手动安装语言包</b>
  • <b>五个常见 PHP数据库问题</b>
  • Windows中Alt键的12个高效快速的利用本领介绍
  • <b>MySQL ORDER BY 的实现解析</b>
  • <b>详解MySQL存储历程参数有三种范例(in、out、inout)</b>
  • <b>Win8系统恢复出来经典的开始菜单的办法</b>
  • <b>Win8系统花屏怎么办 Win8系统花屏的办理办法</b>
  • <b>Windows 7系统下无线网卡安装</b>
  • <b>为什么 Linux不需求碎片整理</b>
  • <b>Windows 8中删除账户的几种办法(图)</b>
  • <b>教你如安在win7下配置路由器</b>
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .