QT之GUI学习笔记(十八)---自定义事件

原文地址:http://devbean.blog.51cto.com/448512/232314

一.基本概念

1.自定义事件类型的作用
(1)在多线程的程序中可以创建自己的事件类型是比较有用的;
(2)在单线程的程序中,作为一种对象间通讯的机制
2.选用事件机制而不选用信号槽机制的原因
(1)事件的分发既可以是同步的,又可以是异步的,而函数的调用或者说是槽的回调总是同步的。
(2)事件可以使用过滤器
3.Qt如何自定义事件
继承一个类进行扩展。
在Qt中,你需要继承的类是QEvent。
4.如何继承QEvent类
(1)
需要一个QEvent::Type类型的参数,作为自定义事件的类型值,由于QEvent::Type类型是QEvent里面定义的一个enum(枚举),因而也可以传递一个int数值.
(2)
需要注意的是自定义的事件类型不能和已经存在的type值重复。因为系统会将你的事件当做系统事件进行派发和调用。
在Qt中,系统保留0 - 999的值,因此,自定义事件type要大于999。
具体来说,你的自定义事件的type要在QEvent::User和QEvent::MaxUser的范围之间。其中,QEvent::User值是1000,QEvent::MaxUser的值是65535。

二 代码

从基本概念中得知可以自定义64536个事件,这个数字已经足够大了!但是,这只能保证用户自定义事件不能覆盖系统事件,并不能保证自定义事件之间不会被覆盖。
1.为了解决这个问题,Qt提供了一个函数:

registerEventType()

用于自定义事件的注册。
该函数签名如下:

static int QEvent::registerEventType ( int hint = -1 );

(1)函数是static的,因此可以使用QEvent类直接调用。
(2)函数接受一个int值,其默认值为-1,返回值是创建的这个Type类型的值。
(3)如果hint值是合法的,不会发生任何覆盖,则会返回这个值;如果hint不合法,系统会自动分配一个合法值并返回。
因此,使用这个函数即可完成type值的指定。这个函数是线程安全的,因此不必另外添加同步
2.你可以在QEvent子类中添加自己的事件所需要的数据,然后进行事件的发送。
Qt中提供了两种发送方式:
(1)

static bool QCoreApplication::sendEvent(QObjecy * receiver, QEvent * event)

事件被QCoreApplication的notify()函数直接发送给receiver对象,返回值是事件处理函数的返回值,使用这个函数必须要在栈上创建对象。

示例

QMouseEvent event(QEvent::MouseButtonPress, pos, 0, 0, 0);
QApplication::sendEvent(mainWindow, &event);

(2)

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()函数可以让已提交的事件立即得到处理。
3.处理自定义事件
(1)方式一:重写QObject的customEvent()函数。
该函数接收一个QEvent对象作为参数。

void CustomWidget::customEvent(QEvent *event) {
        CustomEvent *customEvent = static_cast<CustomEvent *>(event);
        // ....
}

(2)方式二:重写event()函数来处理自定义事件

bool CustomWidget::event(QEvent *event) {
        if (event->type() == MyCustomEventType) {
             CustomEvent *myEvent = static_cast<CustomEvent *>(event);
                // processing...
        return true;
        }

        return QWidget::event(event);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值