开源是QtFramework的重要优势。代码开源可以让我们快速定位疑难杂症,更可以学习到优秀技术和思想,提高自身技术素养。但是,许多初学者在初次阅读Qt代码时,都会被里面大量存在的的Q_D、Q_Q宏弄得晕头转向。例如:
Q_D(QObject);
d->blockSig = true; // d是从哪出来的? 怎么没见到过声明
//...
因此,为了更好地阅读和理解Qt代码,我们必须了解这两个宏的含义。
宏Q_D和Q_Q是Qt pimpl设计模式的体现。pimpl模式是一种常见的设计模式,用于隐藏一个类的实现细节,从而减少编译依赖和提高封装性,达到提高编译速度和增加二进制接口的稳定性的目的。
宏Q_D和Q_Q中的"D"和"Q"分别是"Data"和"Qt"的缩写:
- “D"代表"Data”,在这里指的是类的私有数据部分,即私有实现(Private Implementation)。
- "Q"代表"QObject"或者更泛化地指的是类的公共部分(Public
Interface)。或者,就是指代Qt本身,即使用者认知里的Qt(提供的对外接口)。
所以,Q_D宏用于获取(Query)指向