1. 模型
Example类
1 2 3 4 5 6 7 8 9
| class Example { Q_OBJECT Q_DECLARE_PRIVATE(Example) public: Example(); ~Example();
ExamplePrivate *d_ptr; };
|
ExamplePrivate类
1 2 3 4 5 6 7 8
| class ExamplePrivate { Q_DECLARE_PUBLIC(Example) public: ExamplePrivate(Example *example);
private: Example *q_ptr; };
|
2. Q_DECLARE_PRIVATE 宏的展开
1 2 3 4 5 6 7 8 9 10 11 12 13
| #define Q_DECLARE_PRIVATE(Class) \ inline Class##Private* d_func() \ { Q_CAST_IGNORE_ALIGN(return reinterpret_cast<Class##Private *>(qGetPtrHelper(d_ptr));) } \ inline const Class##Private* d_func() const \ { Q_CAST_IGNORE_ALIGN(return reinterpret_cast<const Class##Private *>(qGetPtrHelper(d_ptr));) } \ friend class Class##Private;
inline ExamplePrivate* d_func() { return reinterpret_cast<ExamplePrivate *>(d_ptr); } friend class ExamplePrivate;
|
3. Q_DECLARE_PUBLIC 宏的展开
1 2 3 4 5 6 7 8 9 10 11
| #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;
Example* q_func() { return static_cast<Example *>(q_ptr); } friend class Example;
|
4. Q_D
1 2 3 4 5
| #define Q_D(Class) Class##Private * const d = d_func()
Example * const d = d_func();
|
5. Q_Q
1 2 3 4 5
| #define Q_Q(Class) Class * const q = q_func()
Example * const q = q_func();
|
6. 总结
Q_DECLARE_PRIVATE一般用于主类的XXXPrivate成员声明,而且声明为friend类型,可以让这个XXXPrivate类型成员方便的访问主类所有成员;Q_DECLARE_PUBLIC用于XXXPrivate类里面对主类的声明,也将主类声明为friend类型;在主类里面可以用Q_D访问XXXPrivate类型的指针,在XXXPrivate类里面可以用Q_Q访问主类指针