Qt-Qt的事件系统

        Qt的事件系统

        窗口系统是由事件驱动的,Qt为事件处理编程提供了完善的支持,QWidget类是所有界面组件类的基类,QWidget类定义了大量与事件处理相关的数据类型和接口函数,本节学习Qt的事件系统的工作原理,包括事件的产生和派发,事件类型的事件处理等内容。

        事件的产生和派发 

1,事件的产生
        事件表示应用程序中发生的操作或变化,如移动鼠标,点击鼠标,按下按键等,在Qt中,事件是对象,是QEvent类或其派生类的实例,如QKeyEvent是按键事件类,QMouseEvent是鼠标事件类,QPaintEvent是绘制事件类,QTimerEvent是定时器事件类。
        按照事件的来源可以将事件划分成3类。
                自生事件:是由窗口系统产生的事件,例如QKeyEvent事件,QMouseEvent事件,自生
                事件会进入系统列队,然后被应用程序的事件循环逐个处理。

                发布事件:是由Qt或应用程序产生的事件,如QTimer定时器发生定时溢出时Qt会自动
                发布QTimerEvent事件。应用程序使用静态函数QCoreApplication::postEvent()产生
                发布事件,发布事件会进入Qt事件队列,然后由应用程序的事件循环进行处理。

                发送事件:是由Qt或应用程序定向发送给某个对象的事件,应用程序使用静态函数
                QCoreApplication::sendEvent() 产生发送事件,由对象的event()函数直接处理。

        窗口系统产生的自生事件自动进入系统队列,应用程序发布的事件进入Qt事件队列,自生事件和发布事件的处理是异步的,也就是事件进入队列后由系统去处理,程序不会在产生事件的地方停止进行等待,应用程序使用静态函数QCoreApplication::postEvent()发布事件,这个函数的原型定义如下:
        void QCoreApplication::postEvent( QObject* receiver , QEvent* event , int priority =                                                                 Qt::NormaleventPriority )
其中receiver是接收事件的对象,event是事件的对象,priority是事件的优先级。
        在程序中调用QCoreApplication::postEvent()发布一个事件后,这个函数立刻会退出,不会等到事件处理完以后再退出,所以,发布事件的处理是异步的。
        应用程序使用静态函数QCoreApplication::sendEvent()向某个对象定向发送事件,函数定义如下:
        void QCoreApplication::sendEvent( QObject* receiver , QEvent* event )
其中receive是接收事件的对象,event是事件对象,这个函数是以同步模式运行的也就是它需要等到对象处理完事件后才退出。
具体来说:

  • 当你调用 sendEvent(QObject *receiver, QEvent *event) 时,receiver 对象会立即收到 event
  • sendEvent() 会调用 receiver 的 event() 函数(或者相应的事件处理函数,如果已经重写)。
  • sendEvent() 会在 receiver 处理完事件后返回,此时调用者可以继续执行后续代码。

 

2,事件的派发
        GUI应用程序的main()函数代码一般是下面这样的结构。

        这段代码创建了一个QApplication对象 a,还创建了一个窗口w,运行w.show()显示窗口。后运行a.exec(),开始应用程序的事件循环。
        函数QApplication::exec()的主要功能就是不断地检查系统队列和Qt事件队列里是否有未处理的自生事件和发布事件。如果有事件就派发(dispatch)给接收事件的对象去处理,应用程序的事件循环还可以对队列中的相同事件进行合并处理,例如如果队列中有一个界面组件的多个QPainEvent事件(绘制事件),应用程序就只派发一次QPaintEvent事件,因为界面只需要绘制一次。
        注意,应用程序的事件循环只处理自生事件和发布事件,用户操作时不会感觉到响应迟滞,

          

  • 8
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值