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又是个啥?

 

posted @ 2022-06-07 22:00  helloc14  阅读(573)  评论(0编辑  收藏  举报