首先跳到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又是个啥?