「QT」高阶篇 之 d-指针 的用法

在这里插入图片描述

✨博客主页
何曾参静谧的博客
📌文章专栏
「QT」QT5程序设计
📚全部专栏
「Win」Windows程序设计「IDE」集成开发环境「UG/NX」BlockUI集合
「C/C++」C/C++程序设计「DSA」数据结构与算法「UG/NX」NX二次开发
「QT」QT5程序设计「File」数据文件格式「UG/NX」NX定制开发
「Py」Python程序设计「Math」探秘数学世界「PK」Parasolid函数说明

目录

    • Qt中的d-pointer(d-指针)与QSharedDataPointer用法详解
      • 一、d-pointer的基本用法
      • 二、QSharedDataPointer的用法
      • 三、d-func()和const d-func()的使用
      • 四、总结

Qt中的d-pointer(d-指针)与QSharedDataPointer用法详解

在Qt框架中,d-pointer(d-指针)是一种常用的设计模式,用于隐藏类的实现细节,提高代码的可维护性和封装性。d-pointer通常与Pimpl(Pointer to IMPLementation)惯用法相结合,通过将类的实现细节封装在一个私有或受保护的类中,并在头文件中仅暴露一个指向该私有类的指针,从而减少了头文件的依赖和编译时间。

在Qt中,QSharedDataPointer是一个特殊的智能指针,用于管理实现了QSharedData接口的类的数据。这种智能指针允许数据在多个对象之间共享,同时确保数据的正确删除和内存管理。当最后一个使用数据的对象被销毁时,数据也会被自动删除。

下面,我们将详细探讨QFileInfo类(假设其内部使用了d-pointer和QSharedDataPointer)中这些技术的用法。

一、d-pointer的基本用法

在Qt中,d-pointer通常定义为一个私有或受保护的成员变量,指向一个包含类实现细节的私有类。这个私有类通常被称为“d类”或“实现类”。

// QFileInfo.h
class QFileInfoPrivate; // 前向声明私有类

class QFileInfo {
protected:
    QSharedDataPointer<QFileInfoPrivate> d_ptr; // d-pointer,使用QSharedDataPointer管理

public:
    // ... 类的公共接口 ...

private:
    // 声明d-func()和const d-func()成员函数,用于访问d-pointer
    QFileInfoPrivate* d_func();
    inline const QFileInfoPrivate* d_func() const {
        return d_ptr.constData(); // 返回d-pointer指向的const数据
    }

    // ... 类的私有接口和成员 ...
};

在上面的代码中,QFileInfo类包含一个受保护的QSharedDataPointer<QFileInfoPrivate>成员变量d_ptr。这个指针指向QFileInfoPrivate类的实例,后者包含了QFileInfo类的所有实现细节。

二、QSharedDataPointer的用法

QSharedDataPointer是Qt提供的一个模板类,用于管理实现了QSharedData接口的类的实例。当多个QFileInfo对象共享相同的QFileInfoPrivate数据时,QSharedDataPointer可以确保这些数据只被存储一次,并在所有引用它的对象被销毁时自动删除。

// QFileInfoPrivate.h
#include <QSharedData>

class QFileInfoPrivate : public QSharedData {
public:
    // ... 类的成员变量和成员函数 ...

    // 例如,可能包含文件路径、大小、权限等信息
    QString filePath;
    qint64 fileSize;
    // ... 其他成员 ...
};

QFileInfoPrivate类中,我们继承自QSharedData,这使得我们可以使用QSharedDataPointer来管理它的实例。

三、d-func()和const d-func()的使用

为了访问d-pointer指向的私有类实例,QFileInfo类提供了d_func()const d_func()成员函数。这些函数返回指向QFileInfoPrivate实例的指针或const指针,允许在类的非const成员函数和const成员函数中分别访问和修改私有数据。

// QFileInfo.cpp
#include "QFileInfo.h"
#include "QFileInfoPrivate.h"

// 实现d-func()
QFileInfoPrivate* QFileInfo::d_func() {
    return reinterpret_cast<QFileInfoPrivate*>(d_ptr.data()); // 转换为正确的类型
}

// ... 其他QFileInfo成员函数的实现 ...

// 例如,一个获取文件路径的函数
QString QFileInfo::filePath() const {
    Q_D(const QFileInfo); // 使用Q_D宏简化d-pointer的访问
    return d->filePath; // 访问私有数据
}

在上面的代码中,我们使用了Q_D宏来简化对d-pointer的访问。这个宏在Qt中定义,用于声明一个名为d的局部变量,并将其初始化为调用d_func()的结果。这样,我们就可以在函数体内使用d来访问私有数据了。

四、总结

通过使用d-pointer和QSharedDataPointer,Qt类可以在保持接口稳定的同时,灵活地修改其内部实现。这种技术减少了头文件的依赖,提高了编译速度,并允许类的私有数据在多个对象之间安全地共享。在Qt框架中,这种设计模式被广泛采用,是Qt代码库中的一个重要组成部分。


在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/916498.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ISUP协议视频平台EasyCVR视频设备轨迹回放平台智慧农业视频远程监控管理方案

在当今快速发展的农业领域&#xff0c;智慧农业已成为推动农业现代化、助力乡村全面振兴的新手段和新动能。随着信息技术的持续进步和城市化进程的加快&#xff0c;智慧农业对于监控安全和智能管理的需求日益增长。 视频设备轨迹回放平台EasyCVR作为智慧农业视频远程监控管理方…

计算机视觉空域处理完整版——超详细图文解

空域处理 图像空域处理 a.线性滤波b.非线性滤波c.二值图像处理方法 数学形态学连通成分标记 “点运算”是在不改变图像大小、几何形状以及局部结构的情况下&#xff0c;对像素值进行修改&#xff0c;新图像的像素值只与 原图像同一位置的像素值有关。 灰度级变换(线性变换,非…

Python学习------第八天

函数 函数的传入参数 掌握函数返回值的作用 掌握函数返回值的定义语法 函数的嵌套调用&#xff1a; 函数的局部变量和全局变量 局部变量的作用&#xff1a;在函数体内部&#xff0c;临时保存数据&#xff0c;即当函数调用完成后&#xff0c;则销毁局部变量。 money 5000000 n…

Matlab实现麻雀优化算法优化随机森林算法模型 (SSA-RF)(附源码)

目录 1.内容介绍 2.部分代码 3.实验结果 4.内容获取 1内容介绍 麻雀优化算法&#xff08;Sparrow Search Algorithm, SSA&#xff09;是一种基于自然界中麻雀觅食和躲避天敌行为的新型群智能优化算法。SSA通过模拟麻雀群体中个体之间的信息交流和社会互动来指导搜索过程&…

51c嵌入式~单片机合集2

我自己的原文哦~ https://blog.51cto.com/whaosoft/12362395 一、不同的电平信号的MCU怎么通信&#xff1f; 下面这个“电平转换”电路&#xff0c;理解后令人心情愉快。电路设计其实也可以很有趣。 先说一说这个电路的用途&#xff1a;当两个MCU在不同的工作电压下工作&…

web实验3:虚拟主机基于不同端口、目录、IP、域名访问不同页面

创建配置文件&#xff1a; 创建那几个目录及文件&#xff0c;并且写内容&#xff1a; 为网卡ens160添加一个 IPv4 地址192.168.234.199/24: 再重新激活一下网卡ens160&#xff1a; 关闭防火墙、改宽松模式&#xff1a; 重启服务&#xff1a; 查看nginx端口监听情况&#xff1a;…

AutoHotKey自动热键AHK-正则表达式

在这个软件的操作中,基本都是需要即时的解决一些问题,所以对字符串的操作是比较多的,所以正则的使用还是比较重要的,接下来我们用一个例子来了解正则表达式的使用 str "7654321" RegExMatch(str, "65(43)(21)", SubPat)str ( str %str% SubPat %SubPa…

越南很火的slots游戏投放Google谷歌广告策略

越南很火的slots游戏投放Google谷歌广告策略 越南的slot游戏市场正在借助Google广告代投策略推动增长。随着智能手机的普及和互联网的普及&#xff0c;越南的游戏市场迅速增长&#xff0c;吸引了越来越多的投资者和开发者进入该市场。 在这个竞争激烈的市场中&#xff0c;广告…

Mac中安装OhMyZsh

Mac中安装OhMyZsh 文章目录 Mac中安装OhMyZsh一、Homebrew二、OhMyZsh1、Oh-My-Zsh配置1.1&#xff1a;主题配置1.2&#xff1a;插件配置&#xff08;语法高亮和自动提示&#xff09;1、zsh-autosuggestions&#xff08;需下载安装&#xff09;&#xff1a;高亮显示所有支持的命…

flutter插件:录制系统播放的声音

该插件基于flutter包 flutter_screen_recording 和 github库 SystemAudioCaptureAndroid&#xff0c;实现了在安卓手机上录制系统播放声音的功能&#xff0c;也就是说&#xff0c;只要一个安卓应用没有设置不允许其它应用录制声音&#xff0c;该插件可以录制该应用播放的声音。…

【论文阅读】WaDec: Decompiling WebAssembly Using Large Language Model

论文阅读笔记:WaDec: Decompiling WebAssembly Using Large Language Model 1. 来源出处 论文标题: WaDec: Decompiling WebAssembly Using Large Language Model作者: Xinyu She, Yanjie Zhao, Haoyu Wang会议: 39th IEEE/ACM International Conference on Automated Softwar…

【安全测试】sqlmap工具(sql注入)学习

前言&#xff1a;sqimap是一个开源的渗透测试工具&#xff0c;它可以自动化检测和利用SQL注入缺陷以及接管数据库服务器的过程。它有一个强大的检测引擎&#xff0c;许多适合于终极渗透测试的小众特性和广泛的开关&#xff0c;从数据库指纹、从数据库获 取数据到访问底层文件系…

Redis环境部署(主从模式、哨兵模式、集群模式)

一、概述 REmote DIctionary Server(Redis) 是一个由 Salvatore Sanfilippo 写的 key-value 存储系统&#xff0c;是跨平台的非关系型数据库。Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存、分布式、可选持久性的键值对(Key-Value)存储数据库…

【Excel】身份证号最后一位“X”怎么计算

大多数人身份证号最后一位都是数字&#xff0c;但有个别号码最后一位却是“X"。 如果你查百度&#xff0c;会得到如下答案&#xff1a; 当最后一位编码是10的时候&#xff0c;因为多出一位&#xff0c;所以就用X替换。 可大多数人不知道的是&#xff0c;这个10是怎么来的…

Isaac Sim+SKRL机器人并行强化学习

目录 Isaac Sim介绍 OmniIssacGymEnvs安装 SKRL安装与测试 基于UR5的机械臂Reach强化学习测评 机器人控制 OMNI GYM环境编写 SKRL运行文件 训练结果与速度对比 结果分析 运行体验与建议 Isaac Sim介绍 Isaac Sim是英伟达出的一款机器人仿真平台&#xff0c;适用于做机…

Leetcode 743 Network Delay Time

题意&#xff1a;给定n个节点的网络&#xff0c;以及节点之间传输的时间&#xff0c;求从节点k出发传输信息&#xff0c;最少需要多久&#xff0c;所有的节点都能够接收到信息 https://leetcode.com/problems/network-delay-time/description/ 题解&#xff1a;给定一个有向图…

[Android]相关属性功能的裁剪

1.将home界面的search bar 移除 /src/com/android/launcher3/graphics/LauncherPreviewRenderer.java // Add first page QSBif (FeatureFlags.QSB_ON_FIRST_SCREEN) {CellLayout firstScreen mWorkspaceScreens.get(FIRST_SCREEN_ID);View qsb mHomeElementInflater.infla…

qt中ctrl+鼠标左键无法进入

现象&#xff1a;qt中ctrl鼠标左键无法跳转部分函数&#xff0c;例如能跳到textEdit->toPlainText().&#xff0c;但无法跳转到toUtf8();但编译没有问题 排查1&#xff1a;我发现是交叉编译链的问题&#xff0c;使用linux自带就可以进&#xff0c;用ATK-I.MX6U就部分不能进…

【Android】View—基础知识,滑动,弹性滑动

基础知识 什么是View 在 Android 中&#xff0c;View 是用户界面&#xff08;UI&#xff09;中的基本组件&#xff0c;用于绘制图形和处理用户交互。所有的 UI 组件&#xff08;如按钮、文本框、图片等&#xff09;都是 View 的子类。可以说&#xff0c;View 是构建 Android …

2024年十大信创操作系统之中科红旗的红旗 Linux

随着全球信息技术格局的变化与国家信息安全日益重要&#xff0c;操作系统作为计算机硬件与软件之间的中介&#xff0c;逐渐成为了国家竞争力的核心领域之一。尤其是在我国提出自主创新、国产替代的战略背景下&#xff0c;信创&#xff08;信息技术应用创新&#xff09;产业的快…