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
访问主类指针