Qt “扩展”了标准 C++。所谓“扩展”,实际是在使用标准 C++ 编译器编译 Qt 源程序之前,Qt 先使用一个叫做 moc(Meta Object Compiler,元对象编译器)的工具,先对 Qt 源代码进行一次预处理。
Qt 使用 moc,为标准 C++ 增加了一些特性:
- 信号槽机制,用于解决对象之间的通讯,这个我们已经了解过了,可以认为是 Qt 最明显的特性之一;
- 可查询,并且可设计的对象属性;
- 强大的事件机制以及事件过滤器;
- 基于上下文的字符串翻译机制(国际化),也就是 tr() 函数,我们简单地介绍过;
- 复杂的定时器实现,用于在事件驱动的 GUI 中嵌入能够精确控制的任务集成;
- 层次化的可查询的对象树,提供一种自然的方式管理对象关系。
- 智能指针(QPointer),在对象析构之后自动设为 0,防止野指针;
- 能够跨越库边界的动态转换机制。
通过继承QObject类,可以获得这些特性。
QObject是以对象树的形式组织起来的。当你创建一个QObject对象时,会看到QObject的构造函数接收一个QObject指针作为参数,这个参数就是 parent,也就是父对象指针。这相当于,在创建QObject对象时,可以提供一个其父对象,我们创建的这个QObject对象会自动添加到其父对象的children()列表。当父对象析构的时候,这个列表中的所有对象也会被析构。(注意,这里的父对象并不是继承意义上的父类!)