标准C++对象模型为对象范例提供了非常高效的运行时支持。但在某些问题领域,它的静态特性是不灵活的。图形用户界面编程是一个既需要运行效率又需要高度灵活性的领域。通过将C++的速度与QT对象模型的灵活性相结合,Qt提供了这一点。
Qt的这些特性拓展了C++:
- 非常强大的无缝对象通信的信号和槽
- 可查询和可设计的对象属性
- 强大的事件和事件过滤器
- 面向国际化的上下文字符串翻译
- 复杂的时间间隔驱动计时器,使得在事件驱动的GUI中优雅地集成许多任务成为可能
- 以自然方式组织对象所有权的层次化和可查询的对象树
- 智能指针(QPointer)当引用对象被销毁时,自动指针设置为0
- 跨库边界工作的动态强制转换(qobject_cast<>())
- 支持自定义类型创建
这些Qt特性中的许多都是基于QObject继承的标准C++技术实现的。其他的,如对象通信机制和动态属性系统,需要由Qt自己的元对象编译器(moc)提供的元对象系统。
元对象系统是一个C++扩展,使语言更适合于真正的组件GUI编程。
这些类构成了Qt对象模型的基础:
- QMetaClassInfo:有关类的附加信息
- QMetaEnum:有关枚举的元数据
- QMetaMethod:关于成员函数的元数据
- QMetaObject:包含有关Qt对象的元信息
- QMetaProperty:有关属性的元数据
- QMetaType:管理元对象系统中的命名类型
- QObject:所有Qt对象的基类
- QObjectCleanupHandler:监视多个QObjects的生存期
- QPointer:提供指向QObject的智能指针的模板类
- QSignalBlocker:对象信号阻塞的安全封装
- QSignalMapper:绑定可识别发送者发送的信号
- QVariant:最常见的Qt数据类型的联合体
由于下面问题,Qt对象禁用了拷贝构造和赋值运算符:
- 对象可能具有唯一的QObject::objectName()。如果复制一个Qt对象,我们应该给它取什么名字?
- 在对象树层次结构中。如果复制一个Qt对象,那么副本应该在哪里?
- 可以连接到其他Qt对象以向其发射信号或接收其发射的信号。如果复制一个Qt对象,应该如何将这些连接传输到副本?
- 可以在运行时添加新属性,这些属性在C++类中没有声明。如果复制一个Qt对象,那么这个副本应该包括添加到原始对象中的属性吗?