QT源码阅读--QObject

本文详细解析了QT框架中的句柄实体模式实现原理。通过分析QObject类与其私有数据类QObjectData之间的关系,介绍了句柄实体模式的具体应用。同时,文中还解释了Q_D和Q_Q宏的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • QObject 是QT类体系中唯一的基类,大小如下:
    qDebug()<<sizeof(QObject);
    结果为:8
    
    class Q_CORE_EXPORT QObject
    {
        Q_OBJECT
        ...
    protected:
       <span style="color:#ff0000;"> QScopedPointer<QObjectData> d_ptr;</span>
    }
    在QObject类中定义了一个QObjectData 类的指针 d_ptr,我理解为数据类指针。
  • 在QObject 类的定义上面,还有一个QObjectData类,这个类里面封装类数据,而QObject类封装了句柄,这就是所谓的句柄实体模式,我就理解他为句柄--数据分离。
    看到代码中有这么一处
    
    QObjectData {
    public:
        virtual ~QObjectData() = 0;
       <span style="color:#ff0000;"> QObject *q_ptr;</span>
        QObject *parent;
        QObjectList children;
    <span style="white-space:pre">	</span>....
    }
    在QObjectData类中定义了一个QObject 类的指针 q_ptr,我理解为句柄指针。这和上面的d_ptr 结合在一起看,可以得出,这2个类可以相互引用。
  • Q_D和Q_Q
    
    #define Q_D(Class) Class##Private * const <span style="color:#ff0000;">d</span> = d_func()
    #define Q_Q(Class) Class * const <span style="color:#ff0000;">q </span>= q_func()
    我在看QT源码时,发现有非常多的Q_D和Q_Q,之前不知道是什么意思,现在大概了解了,Q_D(xxxClass)表示可以得到xxxClass的数据类,
    Q_Q(xxxClass)表示可以得到xxxClass的接口类。
  • 
    
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值