qt中的句柄类,实体类

本文详细介绍了Qt中如何使用D指针进行句柄类与实体类的封装,强调了D指针的作用,如私有数据封装、减少编译依赖。同时,解释了Q_PRIVATE_SLOT的用途,以及QApplication构造过程中的步骤,展示了QObject的构造流程,包括QObjectData在句柄类与实体类中的角色。
摘要由CSDN通过智能技术生成

1.应用程序封装成so动态库时,需要提供头文件,此时为了把私有数据封装起来,就需要把私有数据封装成private的类,把它放在cpp文件而非h文件中,

这样就把私有数据封装起来不给用户看了。

2.在私有数据修改时,不用重新编译所有文件,只需要编译这个动态库就可以了,因为头文件并没有改变。

D指针/私有实现

使用D指针:

class MyClass 

public: 
MyClass(); 
~MyClass(); 
private: 
MyClassPrivate * const d_ptr; 
Q_DECLARE_PRIVATE(MyClass); 
}; 
class MyClassPrivate;

定义了一个指针d_ptr指向私有实现类,然后用Q_DECLARE_PRIVATE宏来定义一些辅助函数和声明友元类:

#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; 

只要在类的头文件中使用这两个宏,就可以通过函数直接得到实体类和句柄类的实际类型了,而且这里还声明了友元,使得数据类和句柄

类连访问权限也不用顾忌了

然后这个私有类的实现如下所示:

class MyClassPrivate 

public: 
    MyClassPrivate(MyClass *parent); 
private: 
    MyClass * const q_ptr; 
    Q_DECLARE_PUBLIC(MyClass); 
    int myVar; 
}; 

这里的q_ptr指针就是指向公开的接口了,然后Q_DECLARE_PUBLIC宏则定义了辅助函数并声明了友元类:

#define Q_DECLARE_PUBLIC(Class) \ 
inline Class* q_func() { return static_cast<Class *>(q_ptr); } \ 
inline const Class* q_func() const { return static_cast<

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在这里,句柄指的是一个用来标识对象或者项目的标识符。句柄可以用来描述窗体、文件等。在Windows操作系统句柄是一种特殊的标识符,用于表示对象。句柄可以被看作是操作系统用来找到一块内存的一种机制。句柄可以是标识符,也可以是指针,具体取决于操作系统的处理方式。句柄只属于Windows,只能由Windows API使用。通过句柄,程序员只能调用系统提供的服务(即API调用),不能像使用指针那样进行其他操作。所以,在句柄可以用来操作对象或者调用系统提供的服务。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [句柄是什么](https://blog.csdn.net/fuhanghang/article/details/109378655)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [Linux 句柄是什么](https://blog.csdn.net/yffhhffv/article/details/84001670)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值