Qt对象模型 标准的C++对象模型为对象范例提供了十分有效的运行时刻支持。但是这种C++对象模型的静态性质在一定的问题领域是不够灵活的。图形用户界面编程就是一个同时需要运行时刻的效率和高水平的灵活性的领域。Qt 通过结合 C++的速度为这一领域提供了Qt 对象模型的灵活性。 Qt 把下面这些特性添加到了C++当中: • 一种关于无缝对象通讯被称为信号和槽的非常强大的机制, • 可查询和可设计的属性, • 强大的事件和事件过滤器, • 根据上下文进行国际化的字符串翻译, • 完善的时间间隔驱动的计时器使得在一个事件驱动的图形界面程序中很好地集成许多任务成为可能。 • 以一种自然的方式组织对象所有权的分层次和可查询的对象树。 • 被守护的指针,QGuardedPtr,当参考对象被破坏时,可以自动地设置为无效,不像正常的C++指针在它们的对象被破坏的时候变成了“摇摆指针”。 许多Qt的特性是基于QObject的继承,通过标准C++技术实现的。其他的,比如对象通讯机制和虚拟属性系统,都需要Qt自己的元对象编译器(moc) 提供的元对象系统。 元对象系统是一种可以使语言更加适用于真正的组件图形用户界面程序的C++扩展。尽管模板也可以用来扩展C++,元对象系统提供给标准C++而模板所不能提供的益处,请看为什么Qt不用模板来实现信号和槽?。 对象树和对象所有权 QObject在对象树中组织它们自己。当你以另外一个对象作为父对象来创建一个QObject时,它就被添加到父对象的children() 列表中,并且当父对象被删除的时候,它也会被删除。这种机制很好的适合了图形用户界面应用对象的需要。例如,一个QAccel(键盘快捷键)是相关窗口的子对象,当用户关闭该窗口的时候,这个快捷键也被删除了。 静态函数QObject::objectTrees()提供了访问当前存在的所有跟对象的方法。 QWidget,在屏幕上显示的任何东西的基类,扩展着父-子对象关系。一个子对象通常就是一个子窗口部件,也就是说,它被显示在父对象的坐标系统中并且在图象上由父对象的边界夹住。例如,当一个应用程序在一个消息框被关闭之后删除这个消息框时,消息框的按钮和标签正如我们所想要的也被删除了,因为这些按钮和标签都是消息框的子对象。 你也可以自己删除子对象,这样它们就会把它们自己从它们的父对象中移除。例如,当用户移除工具条可以导致应用程序删除它的一个QToolBar对象,在这种情况工具条的QMainWindow父对象会检测到这种变化并因此而重新构成屏幕空间。 ...