1.1       概述

QT是一个基于C++的图形UI库,但它不仅仅局限于UI,它集成了当前相当广泛的不同技术,如GUI技术、数据存储技术、多媒体技术、网络技术、Web技术、脚本技术等等。提到C++,必然涉及到对象模型。

标准的C++对象模型已经高效地支持了对象技术,但是标准C++对象模型的静态特性在某些问题域中很不灵活。比如GUI就是这样一种问题域,它即需要高效的运行效率,又需要高度的灵活性。很幸运,QT可以完美的适用于这个领域,它基于C++,同时提供了QT对象模型,即保证了运行速度又提供了GUI编程的灵活性。

下面介绍一下QT为C++新增加的特征:

  1. 强大的对象间无缝通信机制——信号槽;

  2. 可以定制和查询的对象属性;

  3. 强大的事件系统;

  4. 方便的国际化能力;

  5. 通过精密间隔的定时器在事件驱动的GUI中优雅地整合多种任务;

  6. 以自然的层次式和可查询的对象树形式组织对象的所有关系;

  7. 当守卫指针(QPointer)引用的对象被删除的时候,它会自动被设置为0,不像普通的C++指针,当他们的对象被删除时他们就变得非常危险;

  8. 跨边界动态转换;

  9. 支持创建自定义类型。

1.2      重要的类

QMetaClassInfo:关于一个类的附加信息类;

QMetaEnum:元数据枚举类;

QMetaMethod:关于成员函数的元数据;

QMetaObject:包含了关于QT对象的元信息;

QMetaProperty:属性的元数据;

QMetaType:在元对象系统中管理被命名的类型;

QObject:所有QT对象的基类;

QObjectCleanupHandler:观测多个QObjects对象的生命周期;

QPointer:为Qobject对象提供守卫指针的模板类;

QSignalBlocker:围绕QObject::blockSignals()封装的安全异常类;

QSignalMapper:从可识别的发送者绑定信号;

QVariant:类似于QT大多数通用数据的联合体。


1.3       QT对象:标识与值

我们需要将QT对象作为标识(identity)而不是值(value)。这里说一下标识和值的区别:值是拷贝的或者分配来的;标识则是克隆来的。克隆意味着建立新的标识,而不仅仅是旧标识的一份拷贝。举个例子,双胞胎是不同的标识(identity),他们看起来是一样的,但是他们有不同的名字,不同的地点,和许多完全不同的社会关系网。

克隆一个标识是比拷贝和分配值更复杂的操作。我们在QT对象模型中看到这样的情形。

一个QT对象:

1 也许有一个独特的QObject::objectName()。如果我们拷贝一个Qt对象,我们将给这份拷贝什么名字?

2 在对象层次中有位置。如果我们拷贝QT对象,这份拷贝将放在何处?

3 可以关联到其他QT对象,来发送或者接受信号,如果们拷贝一个QT对象,我们如何将这些链接转移到拷贝对象上?

4 可以在运行时增加新的属性,这些属相在声明时则没有。如果我们拷贝QT对象,是否拷贝对象包含了原始对象的新增属性?

出于上述原因,QT对象应该被作为标识(identity)对待而不是值(value)。标识是被克隆的,不是拷贝或者分配来的,同时克隆是比复制或者分配值更加复杂的操作。因此,QObject及其所有子类(直接子类或者间接子类)的拷贝构造函数和赋值运算符都是无效的。