The Annotated Qt之QObject分析(1)

来源:互联网 发布:怎么改淘宝手机号 编辑:程序博客网 时间:2024/04/30 11:31

引言

    记得阅读侯捷先生的《STL源码剖析》,开篇有句话是“源码之前,了无秘密”,对很多人来说,优秀源码是最好的导师。“天下大作,必作于细”,进阶之路,就从阅读源码开始吧。

    Qt是一个优秀的跨平台应用程序框架,对于使用Qt构建系统的程序员来说,或多或少想窥其底层实现一二,知其然还要知其所以然,本文就从QObject类开始,介绍Qt框架背后的运行机制。

QObject介绍

    QObject类是所有Qt对象的基类。

    QObject是Qt对象模型的核心,这个模型的主要特征是它为对象间的通信提供了一个强大的称为“signals and slots”的机制。你可以使用connect()函数连接一个signal(信号)到一个slot(槽)上,同时你可以使用disconnect()函数销毁这个连接,当然信号和槽机制的功能远不止这些。

    QObject的对象们以对象树(object trees)的方式组织自己。当你创建了一个QObject对象C,同时以另一个QObject对象P作为父对象(parent),父对象P会自动的把新创建的子对象C添加到它的children链表中。父对象P具有这个子对象C的所有权,它会在析构函数中自动销毁它所有的children对象。你可以使用findChild()或者findChildren()找到一个对象的某个child或者所有children。

    每个QObject对象具有一个objectName属性,它的类名(class name)可以通过这个对象的metaObject(元对象)找到。你可以通过QObject的继承体系,使用inherits()函数判断一个Qt对象所属的类是否继承自另外一个Qt类。

    当一个QObject对象被删除前,会发出一个destroyed() 信号,程序开发者可以捕获这个信号,对它的子对象做一些处理,防止悬空指针存在。

    QObject对象可以通过events()函数获取事件。

    QObject类也提供了基础的计时器支持,当然Qt的QTimer也提供了一个high-level的定时器支持。

    特别要注意的是,Q_OBJECT宏是任何需要实现signal,slots或者properties的QObject子类必须添加的。支持该宏的源文件需要通过运行Meta Object Compiler生成相关的文件。不管你是否需要使用signal,slots或者properties,强烈推荐在QObject的所有子类中使用Q_OBJECT宏,以防止不使用Q_OBJECT宏所带来的一些奇异错误。

    所有的Qt的widget类都继承自QObject类,QObject类中的isWidgetType()函数用来判断某个对象是否为一个widget,这个函数的效率远高于使用qobject_cast<QWidget *>(obj) 或者obj->inherits("QWidget")。

    QObject类没有公有的拷贝构造函数和赋值函数,它们被声明为私有的。这样,在需要拷贝和赋值的时候,你只能使用QObject子类的指针或引用,你无法再QVector这类容器中存储值类型,因为它需要拷贝构造函数。

    QObject支持动态属性(dynamic properties),在运行时(run-time)可为QObject的实例增加或删除动态属性。动态属性不需要再编译时(compile-time)声明,但它提供了跟静态属性(static properties)同样的好处。可使用property()函数读取动态属性的值,使用setProperty()为动态属性赋值。

    另外,QObject类还提供了国际化支持,在QObject的子类中使用tr(),使得我们可以将用户接口的文字翻译为另一种文字。

    一句话,核心基类、信号和槽、Q_OBJECT宏、动态属性、国际化支持等等,是QObject类的关键词,QObject类承载了众多的重要特征,想知道它的真面目,就从源码开始吧。
原创粉丝点击