Object Model
标准C++对象模型为对象范式提供高效的运行时支持. 但是它的静态性质在某些情况下不够灵活. GUI编程一个既要求灵活, 运行时又高效的领域. 为了满足此类要求, Qt结合C++提供Qt对象模型.
Qt在C++的基础上增加以下功能:
- 一种非常强大的对象通信机制, 被称为 信号和槽
- 可查询和设计的 对象属性
- 强大的 事件和事件过滤器
- 字符串国际化翻译
- 复杂的时间间隔驱动 定时器, 使许多任务可以优雅地集成到事件驱动的GUI
- 分层和可查询的 对象树, 以自然地方式组织对象所有权
- 保护指针 (QPointer), 引用对象销毁时, 指针自动设为0. C++指针销毁时, 变为悬垂指针.
- 跨库边界的 动态类型转换.
- 支持 自定义类型.
Qt的许多特性是继承 QObject, 基于标准C++技术实现. 另一些, 对象间通信机制和动态属性系统, 依赖Qt的元对象编译器(moc)提供的 元对象系统.
元对象系统是一个C++扩展, 使Qt更适于真正的GUI组件编程.
重要的类
下列类基于Qt的对象模型.
Additional information about a class | |
Meta-data about an enumerator | |
Meta-data about a member function | |
Meta-data about a property | |
Manages named types in the meta-object system | |
The base class of all Qt objects | |
Exception-safe wrapper around QObject::blockSignals() | |
Watches the lifetime of multiple QObjects | |
Contains meta-information about Qt objects | |
Template class that provides guarded pointers to QObject | |
Bundles signals from identifiable senders | |
Acts like a union for the most common Qt data types |
Qt对象: 标识和值
上面所提及的Qt对象模型特性, 要求我们将Qt对象作为一个标识, 而不是值. 值是可复制或可赋值的; 标识是可克隆的. 克隆意味创建一个新的标识, 而不是旧对象的完全复制. 例如, 双胞胎有不同的标识. 它们可能看起来一模一样, 但是有不同的名字, 不同的未知, 可能有完全不同的社交网络.
克隆一个标志比复制或赋值一个值更复杂. 对于Qt对象模型意味什么.
一个Qt对象...
- 可能有唯一的 QObject::objectName(). 如果我们复制一个Qt对象, 我们应该给这个复制对象什么名字?
- 在 对象层次结构有一个位置. 如果我们复制一个Qt对象, 我们应该把这个复制对象放到哪里?
- Qt对象可以连接信号和槽函数, 并收发信号. 如果我们复制一个Qt对象, 我们应该怎么处理这些连接?
- Qt对象可能在运行时添加 新属性 , 这些属性在C++类中未声明. 如果我们复制一个Qt对象, 我们是否应该包含这些新属性?
基于上述原因, Qt对象应看成一个标识, 而不是作为值. 标识是可以克隆, 不能复制或赋值, 克隆标识比复制或赋值更复杂. 因此, QObject 及其所有子类(直接或间接)禁用 复制和赋值函数.