宏定义
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;
};