QT笔记——Q_Q 和Q_D 学习

news/2024/11/29 12:39:53/

在源码中,我们会经常看到Q_Q 和 Q_D 这两个东西 ,很好奇,就去网上搜索了一些和 查看了一些源码 部分

一:Q_D相关宏

#define Q_D(Class) Class##Private * const d = d_func()Q_D(Test);
//展开后  是一个  私有类的指针常量 
TestPrivate * const d = d_func();

有人不知道“##” 是什么意思,其实就是一个连接符 将A##B -》 AB 组成一个新的字符串名称

Q_DECLARE_PRIVATE(Class)

#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;Q_DECLARE_PRIVATE(Test)
//展开后inline TestPrivate* d_func() {return reinterpret_cast<TestPrivate *>(qGetPtrHelper(d_ptr));}inline const TestPrivate* d_func() const{return reinterpret_cast<const TestPrivate *>(qGetPtrHelper(d_ptr));}friend class TestPrivate;

d_ptr 指针:在主类里面写,来访问我们的私有类

二:Q_Q相关宏

#define Q_Q(Class) Class * const q = q_func()Q_Q(Test);
//展开后
Test* const q = q_func();

Q_DECLARE_PUBLIC(Class)

#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;Q_DECLARE_PUBLIC(Test)  
//展开后:inline Test* q_func() { return static_cast<Test*>(q_ptr); } inline const Test* q_func() const { return static_cast<const Test*>(q_ptr); } friend class Test;

q_ptr 指针:在私有类 里面写,来访问我们的主类

使用这两个指针的好处:
1.保证代码的二进制兼容性;
二进制兼容性:动态链接到库的前一个版本的程序继续与库的新版本一起运行而不需要重新编译,则库是二进制兼容的。
要能够实现二进制兼容,就要求每一个结构以及每一个对象的数据模型保持不变。所谓“数据模型保持不变”,就是不能在类中增加、删除数据成员
2.隐藏实现细节;

3.提高编译速度

QQAndQDTest.h

#pragma once#include <QtWidgets/QWidget>
#include <QObject>class QQAndQDTestPrivate;
class QQAndQDTest : public QObject
{Q_OBJECTpublic:QQAndQDTest(QObject*parent = Q_NULLPTR);~QQAndQDTest();public:void showMsg();void setValue(int value);int getValue();private:QQAndQDTestPrivate* const d_ptr;Q_DECLARE_PRIVATE(QQAndQDTest)
};class QQAndQDTestPrivate : public QObject
{Q_OBJECTpublic:QQAndQDTestPrivate(QQAndQDTest* q, QObject* parent = Q_NULLPTR);~QQAndQDTestPrivate();void testFunc();
public:QQAndQDTest* const q_ptr;Q_DECLARE_PUBLIC(QQAndQDTest)int m_value;};

QQAndQDTest.cpp

#include "QQAndQDTest.h"
#include <QDebug>
QQAndQDTest::QQAndQDTest(QObject*parent): QObject(parent), d_ptr(new QQAndQDTestPrivate(this))
{}QQAndQDTest::~QQAndQDTest()
{Q_D(QQAndQDTest);delete d_ptr;
}void QQAndQDTest::showMsg()
{Q_D(QQAndQDTest);qDebug() << d->m_value;
}void QQAndQDTest::setValue(int value)
{Q_D(QQAndQDTest);d->m_value = value;
}int QQAndQDTest::getValue()
{Q_D(QQAndQDTest);return d->m_value;
}QQAndQDTestPrivate::QQAndQDTestPrivate(QQAndQDTest* q, QObject* parent): QObject(parent), q_ptr(q), m_value(0)
{}QQAndQDTestPrivate::~QQAndQDTestPrivate()
{delete q_ptr;
}void QQAndQDTestPrivate::testFunc()
{Q_Q(QQAndQDTest);q->showMsg();
}

main.cpp

#include "QQAndQDTest.h"
#include <QtWidgets/QApplication>
#include <QDebug>int main(int argc, char *argv[])
{QApplication a(argc, argv);QQAndQDTest t;t.setValue(10);t.showMsg();return a.exec();
}

我们将值放在 主类的私有类中 ,通过d指针来访问,设置该值 和 获取该值

参考博客:
Q_Q 和 Q_D相关介绍
Q_Q 和 Q_D相关例子
Q_Q 和 Q_D相关说明
Q_Q和Q_D


http://www.ppmy.cn/news/246541.html

相关文章

基于QT平台webapi科大讯飞语音机器人2.0

本博是针对上一个版本的语音机器人更新&#xff0c;主要更新内容为对iat的支持&#xff0c;即使用语音交互取代文字输入的方式&#xff0c;由于之前忙于其他事情一直没来的及更新&#xff0c;以后会将语音机器人一直做下去&#xff0c;添加更多的功能和大家分享。 那么先来看看…

qq等级计算机在线,I'M QQ - QQ官方网站

QQ等级说明 QQ等级规则 通过累积活跃天数&#xff0c;您可以获取相应的QQ等级。累积在线天数将有机会参加我们即将推出的奖励活动和享受相关的优惠服务&#xff0c;而不影响正常的QQ使用。 拥有QQ在线等级为太阳级别及以上的用户&#xff0c;可享受任意上传设置QQ自定义头像和建…

QQ通讯

要求 实现增删改查功能制作代码展示 启动方法 public void start(){Console.WriteLine("程序启动了&#xff0c;这是start方法");//判断是否登录成功if (login()){Console.WriteLine("登录成功!");Menu();//显示菜单}else{Console.WriteLine("账号或…

腾 讯 滑块

腾讯邮箱的登录就两个加密&#xff0c;邮箱本身的&#xff0c;和一个腾讯系的滑块&#xff0c;之前搞的时候和防水墙还是一样的&#xff0c;现在和防水墙已经不同了&#xff0c;但是主要的加密还是tdc这个文件。现在邮箱的滑块和防水墙相比简洁了很多&#xff0c;全程就两个包 …

Q_04_01 什么是Q#?

什么是Q&#xff03;&#xff1f; Q&#xff03;是用于量子计算的可扩展的多范式特定领域编程语言。 Q&#xff03;是一种量子编程语言&#xff0c;它可以用来描述如何在量子机器上执行指令。 可以定位的机器包括许多不同的抽象层次&#xff0c;从各种模拟器到实际的量子硬件…

Q-Q图

Q-Q图 ​  统计学里的Q-Q图&#xff08;Q代表分位数&#xff09;是一个概率图&#xff0c;用图形的方式比较两个概率分布&#xff0c;把他们的两个分位数放在一起比较。首先选好分位数间隔。图上的点&#xff08;x,y)反映出一个第二分布&#xff08;y坐标&#xff09;的分位数…

大数据24小时:地质局发布地质大数据共享平台,科大讯飞将语音识别植入腾讯小Q机器人

地质调查局发布首个地质大数据共享服务平台“地质云”&#xff1b;华为与华制智能合作&#xff0c;共同发布制造业解决方案“智造云”&#xff1b;科大讯飞与腾讯联手&#xff0c;将语音识别技术植入腾讯小Q机器人……以下为您奉上更多大数据热点事件 编辑 | abby 官网 | www.d…

讯连科技

youcam3注册版下载 thunder://QUFodHRwOi8vZHgyLnFpYW5uYW8uY29tOjgwODAvc2VydmxldC9GaWxlRG93bmxvYWQ/dmlkPTAmZmlsZW5hbWU9Ly9pcXNody8tNGUwYS00ZjIwLTUyMDYtNGVhYi8yMDEwLzAyL1lvdUNhbVBhdGNoLTAwMmR3d3cuaXFzaHcuY29tLnJhclpa 注册码YK4694178987463M youcam4注册版 …