对象模型
标准C++对象模型提供了对象范式在运行时的高效性。但是他的一些静态性质在某些领域是不灵活的。在GUI程序中不仅要运行时的高效还需要较高的灵活性。Qt对象模型不急结合了C++运行时的高效并且还相当的灵活。
Qt在C++的基础上海增加了如下特征:
1. 一个强大的机制使得各个对象之间无缝交流:信号和槽;
2. 可查询及可被识别:对象属性;
3. 强有效的事件及事件过滤;
4. 国际化上下文字符串翻译;
5. 复杂的驱动计时器,在以事件为驱动的GUI中进行优雅的调用;
6. 对象树:使得各个对象都有所属;
7. 自定义类型的创建
上述的有些特征是通过在标准C++上继承得到的,如QObject。信号与槽,属性系统是由元对象系统提供的,也就是Qt自己的Meta-Object Compiler。
元对象系统是C++的扩展【这里要注意官方对元对象系统用的词是extension,而国际化上下文等用的是implement】的,这样特性更好的构成了GUI编程。
下面的类都是Qt的对象模型:
QMetaClassInfo | 关于类的附加信息 |
QMetaEnum | 关于枚举器的元数据 |
QMetaMethod | 关于成员函数的元数据 |
QMetaProperty | 关于属性的元数据 |
QMetaType | 管理元对象系统的命名类型 |
QObject | 所有Qt对象的基类 |
QSignalBlocker | 对安全异常的封装与QObject::blockSignals()一样 |
QObjectCleanupHandler | 监控多个QObject的运行周期 |
QMetaObject | 包含关于Qt对象的元信息 |
QPointer | 提供指向QObject的受保护模板类 |
QSingalMapper | 绑定可以被识别的发送方的信号 |
QVariant | 最常见的Qt数据类型的结合体 |
Qt Objects:身份与值
身份是包含一些特征的。比如双胞胎,虽然他们看起来很像(值一样),但有不同的身份。
克隆身份是比复制以及赋值更为复杂的。
如何理解上面克隆身份,比如:
克隆身份要考虑QObject::objectName()是否唯一。
object层次结构上,克隆的QtObject在object层次结构上该如何保证。
在运行时向某个对象加了个特别的属性,克隆时是否也需要保证。
所以Qt对象都是一种标识,而不是一个值。所以QObject的类或子类都禁止其拷贝和赋值操作。