电子报 在线报料 手机报
俱乐部 主编信箱 论坛
网站首页    关于我们    广告合作    新闻中心    电子商务    时代报活动    俱乐部    联系我们    会员中心   
新闻中心
大事件
本埠
中国
财经
国际
体育
网罗
娱乐
 
您所在位置 : 主页 > 新闻中心 > 大事件 >
 
  • Qt 事件处理机制 (上篇)

      

    本篇来介绍Qt 事件处理机制 。深入了解事件处理系统对于每个学习Qt人来说非常重要,可以说,Qt是以事件驱动的UI工具集。 大家熟知Signals/Slots在多线程的实现也依赖于Qt事件处理机制。

    Qt中,事件被封装成一个个对象,所有的事件均继承自抽象类QEvent.  接下来依次谈谈Qt中有谁来产生、分发、接受和处理事件

    1、谁来产生事件: 最容易想到的是我们的输入设备,比如键盘、鼠标产生的

    keyPressEvent,keyReleaseEvent,mousePressEvent,mouseReleaseEvent事件(他们被封装成QMouseEvent和QKeyEvent),这些事件来自于底层的操作系统,它们以异步的形式通知Qt事件处理系统,后文会仔细道来。当然Qt自己也会产生很多事件,比如QObject::startTimer()会触发QTimerEvent. 用户的程序可还以自己定制事件。

    2、谁来接受和处理事件:答案是QObject。在Qt的内省机制剖析一文已经介绍QObject 类是整个Qt对象模型的心脏,事件处理机制是QObject三大职责(内存管理、内省(intropection)与事件处理制)之一。任何一个想要接受并处理事件的对象均须继承自QObject,可以选择重载QObject::event()函数或事件的处理权转给父类。

    3、谁来负责分发事件:对于non-GUI的Qt程序,是由QCoreApplication负责将QEvent分发给QObject的子类-Receiver. 对于Qt GUI程序,由QApplication来负责。

    接下来,将通过对代码的解析来看看QT是利用event loop从事件队列中获取用户输入事件,又是如何将事件转义成QEvents,并分发给相应的QObject处理。

    #include <QApplication>     

    #include "widget.h"     

    //Section 1     

    int main(int argc, char *argv[])     

    {     

        QApplication app(argc, argv);     

        Widget window;  // Widget 继承自QWidget     

        window.show();     

        return app.exec(); // 进入Qpplication事件循环,见section 2     

    }     

    // Section 2:      

    int QApplication::exec()     

    {     

       //skip codes     

       //简单的交给QCoreApplication来处理事件循环=〉section 3     

       return QCoreApplication::exec();     

    }     

    // Section 3     

    int QCoreApplication::exec()     

    {     

        //得到当前Thread数据     

        QThreadData *threadData = self->d_func()->threadData;     

        if (threadData != QThreadData::current()) {     

            qWarning("%s::exec: Must be called from the main thread", self->metaObject()->className());     

            return -1;     

        }     

        //检查event loop是否已经创建     

        if (!threadData->eventLoops.isEmpty()) {     

            qWarning("QCoreApplication::exec: The event loop is already running");     

            return -1;     

        }     

        ...     

        QEventLoop eventLoop;     


    2017-04-29
    上一篇:国际货币基金组织位于巴黎的办公室发生邮件爆 下一篇:北京故宫灵异事件


    时代报介绍 | 版权声明 | 联系我们 | 广告服务 |
    版权所有 时代报 (www.metrosh.com) Copyright (C)2003~2013 All Rights Reserved.