• object model 概述


    Object Model 综述

    标准 C++ 的对象模型为对象的动态特性提供了运行时的支持。 但是它静态的本性决定了在某些领域它表现出僵化、不可扩展的特点。 GUI编程就是一个既需要运行时编译的效率, 也需要极大的灵活性的一个领域。 Qt 通过整合C++的效率和Qt Object Model的灵活性解决了这个问题。

        Qt 为 C++ 增加了这些特性:

    • Signal and Slots  Signal and Slots 提供了对象之间的无缝通信

    • Object Properties  可查询、可识别的对象特性

    • contextual string translation for internationalization    上下文相关的字符串翻译(国际化)

    • Events and event filter 提供了强大的事件机制。

    • Timers  复杂的内部计时器可以简练的在事件驱动的GUI中加入许多任务。

    • 可继承、可查询的对象树合理的管理对象的附属关系

    Guarded Pointers(QPointer) 在对象删除以后自动设为0, 相比之下,C++的指针会在对象删除后悬空。    

        这些特性中大部分是通过 C++ 的技术实现的, 主要是通过继承 QObject 来获取。 而 Signal and Slots   以及 Object Properties  则通过 Meta-Object System 实现。

    Qt 是c++的有效扩展, 虽然模板也可以用于扩展C++, 但是 Meta-Object System 提供了许多模板+标准C++ 无法实现的特性。 参照: Why Doesn't Qt Use Templates for Signals and Slots?

    Qt Objects 特性 vs

    上述Object Model的一些特性需要把 Qt Obejcts看作特性, 而非值。 值能够被复制, 或者赋值, 而特性只能被“克隆”。 克隆表示创建一个新特性, 而不全是复制。 比如, 双胞胎有不同的特性, 他们可能长得很像, 但是他们会有不同的名字, 不同的位置, 可能不同的社交网络。

    由此看来, 特性的克隆是比复制要复杂的多的操作。 对于 Object Model 来说, 它包括:

    • QObject::objectName.  如何为新类的objectName 赋值?

    • Object hierarchy (对象继承树)上的位置,如何给新类一个正确的定位?

    • 如何管理连接到其它类的 signal slot?

    • 对于那些没有在C++类中声明的、在运行时添加的property, 如何处理?

    可见, Qt Object 是无法进行复制操作的, 因此, Qt 使用宏 Q_DISABLE_COPY 禁止使用 “=” 和 拷贝构造函数。

  • 相关阅读:
    谷粒商城Day1
    解决GitHub访问慢的问题
    Java基础知识面试题
    Spring框架学习
    MATLAB基础学习(3)——数值数组及运算
    MATLAB基础学习(2)
    MATLAB基础学习篇(1)
    页面加载之前显示正在加载
    CSS设置多余的文本显示省略号
    Node.js(六)- HTTP知识先填坑
  • 原文地址:https://www.cnblogs.com/aslistener/p/4612881.html
Copyright © 2020-2023  润新知