1. 程式人生 > >Qt中的Q_D宏和d指針

Qt中的Q_D宏和d指針

erp 指針 pan get pri cas 變量 pre urn

  Q_D的設置意在方便地獲取私有類指針,文件為qglobal.h。

1 #define Q_D(Class) Class##Private * const d = d_func()

  d_func()函數如下實現:

1 #define Q_DECLARE_PRIVATE(Class) 2     inline Class##Private* d_func() { return reinterpret_cast<Class##Private *>(qGetPtrHelper(d_ptr)); } 3     inline const Class##Private* d_func() const
{ return reinterpret_cast<const Class##Private *>(qGetPtrHelper(d_ptr)); } 4 friend class Class##Private;

  這裏的d_func()雖然在宏裏面,但是如果代入具體的類型,這裏面就變成了以Class##Private的私有類指針為返回值,以func為函數名的函數。這裏的qGetPtrHelper是

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

  這個模板函數裏面裏的T要套入Class##Private這個具體的類。上面的那個Q_DECLARE_PRIVATE裏面的就成了這個模板類的一個聲明。

  在QObject類裏面存在一個成員變量,d_ptr指針,定義如下:

1     QScopedPointer<QObjectData> d_ptr;

Qt中的Q_D宏和d指針