【翻译】Qt对象模型

标准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对象,那么这个副本应该包括添加到原始对象中的属性吗?

猜你喜欢

转载自blog.csdn.net/kenfan1647/article/details/114953921