Q_DECLARE_PRIVATE和Q_DECLARE_PUBLIC

1,908 阅读1分钟

宏定义

template<typename T>
static inline T* qGetPtrHelper(T* ptr) {
    return ptr;
}

// T*类型的d_ptr -> ClassPrivate*类型的d_ptr
// d_ptr是定义在基类中的,所以更多的是基类的ClassPrivate*指针转换成派生类的ClassPrivate*
/// ObjectData指针
#define Q_DECLARE_PRIVATE(Class) \
    inline Class##Private* d_func() { return reinterpret_cast<Class##Private*>(qGetPtrHelper(d_ptr)); } \
    inline const Class##Private* d_func() const { return reinterpret_cast<const Class##Private*>(qGetPtrHelper(d_ptr)); } \
    friend class Class##Private;

// T*类型的q_ptr -> Class*类型的q_ptr
// q_ptr是定义在基类中的,所以更多的是基类的Class*指针转换成派生类的Class*
/// Object指针
#define Q_DECLARE_PUBLIC(Class)                                    \
    inline Class* q_func() { return static_cast<Class*>(q_ptr); } \
    inline const Class* q_func() const { return static_cast<const Class*>(q_ptr); } \
    friend class Class;

// d为指向ClassPrivate的指针
/// ObjectData指针 d = d_ptr
#define Q_D(Class) Class##Private* const d = d_func();
// q为指向Class的指针
/// Object指针 q = q_ptr
#define Q_Q(Class) Class* const q = q_func();

使用

QObjectData {
    // QObject的数据存放在这里
    QObject* q_ptr;
};

QObject {
    Q_DECLARE_PRIVATE(QObject)
    
    QObjectData* d_ptr;
};

QObjectPrivate : QObjectData{
    Q_DECLARE_PUBLIC(QObject)
};
QWidgetData {
    // QWidget的数据存放在这里
};

QWidget : QObject {
    Q_DECLARE_PRIVATE(QWidget)
};

QWidgetPrivate : QObjectPrivate {
    Q_DECLARE_PUBLIC(QWidget)

    QWidgetData data;
};