• QComboBox 源码解析


    首先跳到QComboBox的构造函数,附上源码截图一张:

     先看前俩行,可以得到一个信息点,QComboBox是继承QWidget,并且new了一个QComboBoxPrivate的对象,至此先抛出一个问题 1)QComboBoxPrivate是个什么东西? 先知识屏蔽,接着往下看,在函数中就写了俩行代码,接着抛出另外三个问题 ,2)Q_D是什么东西?  3)d->init,中d是个什么东西? 4)init做了哪些事情?

    首先现在解决第一个问题

    1)QComboBoxPrivate是个什么东西? 

    跳到QComboBoxPrivate的头文件中,附上源码截图一张:

     可以看到QComboBoxPrivate是继承与QWidgetPrivate,回想一下上一张截图,有点类似与QComboBox继承QWidget的样子,难道有联系?不急慢慢来。紧接着又看到Q_DECLARE_PUBLIC(QComboBox),这又是个什么东西?抛出问题 1.1)Q_DECLARE_PUBLIC是什么意思。接着往下看,附上源码截图一张:

     可以看到有三个成员变量 model,lineedit,container,其他的先假装眼瞎看不见。

    接着又抛出三个问题:

    1.2)QAbstractItemModel *model干啥的?

    1.3)QLineEdit *lineEdit 好像理解为QComboBox是由它和其他组件构成的?

    1.4)QComboBoxPrivateContainer *container 又是个啥东西?

    至此,我们为了解决第一个 1)问题,结果问题没解决又抛出了四个问题.....木得事,继续往下跳到QWidgetPrivate,附上源码截图一张:

     发现QWidgetPrivate 继承与QObjectPrivate,接着往下跳,附上源码截图俩张。

     

     可以看到QObjectPrivate继承QObjectData,终于到底了......

    然后又发生了一件很尴尬的事情,又要抛出问题了:

    1.5)QObjectData 用来干啥的?

    1.6)Q_DISABLE_COPY是个啥?

    1.7)为什么包含QObject*q_ptr,这个又是个啥?

    首先解决问题1.6,跳到Q_DISABLE_COPY的定义,附上源码截图一张:

     可以看到人家已经给出解释了,这是一个宏,这个宏替换后就是

    QObjectData(const class &) = delete;

    QObjectData &operator=(const QObjectData  &) = delete;

    也就是静止这个类进行复制操作,问题1.6解决。

    接着来看问题1.7,附上QObject的源码截图一张(部分):

     

    可以看到在QObject中含有一个d_ptr的指针,抛出问题

    1.8)那么这个指针是在什么是否被赋值的呢?

    1.9)Q_DECLARE_PRIVATE做了什么?

    附上源码截图一张:

     可以发现又是一个宏,定义了内联函数,d_func(),经过替换,也就是 把d_ptr转成QObjectPrivate*的类型,返回回来,并且还把QObjectPrivate申明为友元函数。问题1.9解决。

    附上源码截图一张:

     可以发现QObject在构造函数中new了一个QObjectPrivate,并且QObjectPrivate继承于QObjectData,所以可以把指针赋值给d_ptr,也就是说QObject->d_ptr 指针指向了一个QObjectPrivate,于此同时d_ptr->q_ptr = this;也就是把QObject自身赋值给QObjectData中的q_ptr。综上所述:QObject 和 QObjectPrivate互相引用。至此问题1.7 1.8解决

    顺便附上一张Q_D Q_DECLARE_PUBLIC 的源码截图:

     

      这个宏很明显,就不解释了,问题1.1  2 解决。

    让我们跳回第一张截图:

     至此,代码中大概做了几个事情:

    1)创建一个QComboBox对象,d_ptr指向QComboBoxPrivate

    2)创建一个QComboBoxPrivate对象,q_ptr指向QComboBox

    3)期间为了继承类可以便捷操作Class 以及 ClassPrivate ,定义了一系列的宏。

    同时还留有问题 1.2 1.3 .1.4 1.5  3 未解决。

    暂时先不理会1.x的问题,不影响理解大体的流程,先来看下问题3,附上d->init()源码截图一张:

     可以看到,这个QComboBoxPrivate,其实就是调用了QComboBox的函数,然后把它封装成 QComboBoxPrivate的init函数,再给QComboBox来进行d->init调用;

    QComboBoxPrivate--->d    QComboBox--->q

    跳到函数setModel,再次抛出问题,3.1)setModel是个啥,做了哪些操作? 3.2)QStadardItemModel又是个啥?

  • 相关阅读:
    Java网络编程:OSI七层模型和TCP/IP模型介绍
    Java网络编程:IP地址和端口号
    Java缓冲流的优点和原理
    Java线程的优先级设置遵循什么原则?
    java笔试题大全带答案(经典11题)
    java笔试题大全之IO流常见选择题
    java笔试手写算法面试题大全含答案
    java笔试常见的选择题
    Java的类加载器都有哪些,每个类加载器都有加载那些类,什么是双亲委派模型,是做什么的?
    Java的安全性如何理解
  • 原文地址:https://www.cnblogs.com/helloc14/p/12399486.html
Copyright © 2020-2023  润新知