本文主要介绍Qt对象模型,它有很大的特点。现在让我们先来了解一下。请看内容。Qt对象模型标准的C++对象模型提供了非常有效的操作时间来支持对象范式。但它的静态特性在某些问题领域不够灵活。图形用户界面编程是一个既需要操作时间效率又需要高度灵活性的领域。Qt通过结合C++的速度和Qt对象模型的灵活性来提供这一点。Qt向C++添加了以下功能:称为信号和槽的强大机制,用于无缝对象通信。可查询和可配置的对象属性强大的事件和事件过滤器基于上下文的国际化字符串翻译复杂的间隔驱动计时器可以在事件驱动的图形界面中优雅地集成多个任务。以自然方式组织对象所有权的分层和可查询对象树当引用的对象被销毁时,受保护的指针(QPointer)会自动设置为0,这与普通的C++指针不同,当对象被销毁时,它会变成野指针。跨库边界的动态计算这些Qt功能中的许多功能都是通过基于QObject继承的标准C++技术实现的。其他的,像对象通信机制和动态属性系统,需要Qt自己的元对象编译器(moc)提供的元对象系统。元对象系统是一种C++扩展,它使该语言更适合真正的组件GUI编程。尽管模板也可用于扩展C++,但元对象系统提供了标准C++模板无法实现的优势;请参阅为什么Qt不使用模板来实现信号和槽?Qt对象:身份与值上面列出的许多对象Qt对象模型的附加功能要求我们将对象视为身份,而不是值。值可以复制和给定;身份可以被克隆。克隆意味着创建一个新身份,而不是旧身份的副本。例如,双胞胎有不同的身份。他们可能长得一样,但名字不同,地点不同,甚至可能是完全不同的社交圈。克隆身份是比复制或指定值复杂得多的操作。我们可以看到这在Qt对象模型中的真正含义。一个Qt对象...可能有一个唯一的QObject::objectName()。如果我们复制一个Qt对象,我们应该给副本起什么名字?在对象层次结构中有一个位置。如果我们复制一个Qt对,这个副本应该放在哪里呢?它可以连接到其他Qt对象以向它们发射对象或接收它们发射的信号。如果我们复制一个Qt对象,我们如何将这些连接传递给这个副本?未在C++类中声明的新属性可以在运行时添加到它。如果我们复制一个Qt对象,副本不应该包含我们添加到原始对象的新属性吗?由于这些原因,Qt对象应该被视为身份,而不是值。身份可以被克隆,但不能被复制或指定,克隆身份是比复制或指定值复杂得多的操作。因此,QObject和QObject的所有子类(直接或间接)都使它们的复制构造函数和赋值操作无效。
