当前位置: 首页 > news >正文

qt-声明、宏

前向声明(Forward Declaration)

  • 前向声明是指在使用类或者结构体之前声明其存在,但不包含其定义。
  • 用于告知编译器该类型的名称和基本信息,以便在编译时能够通过类型检查,但不需要知道该类型的详细定义。
// Forward declaration
class MyClass;

引用头文件(Include Directive)

  • 引用头文件是通过 #include 指令将外部文件内容包含到当前文件中。
  • 包含头文件时,编译器会将被包含的文件内容完全复制到包含它的文件中
  • 通常用于包含类的定义、函数声明、宏定义等详细信息,使得当前文件能够访问和使用所包含文件中定义的所有内容。
  • 引用头文件可能会导致编译时间增加,并且在包含大量内容的情况下,可能会导致编译器生成的中间文件增大。

  • 使用前向声明可以减少编译时间和减少编译依赖,特别是在大型项目中。
  • 引用头文件则是必须的,当你需要使用类的详细定义或者类的成员函数时。
  • 通常情况下,应该优先使用前向声明,尤其是在头文件中声明类时,可以通过前向声明减少头文件的依赖关系,提高编译效率和可维护性。

  • 这意味着你不能直接创建 ElaScrollBarPrivate 对象,也不能访问它的成员,但你可以声明指向 ElaScrollBarPrivate 对象的指针或引用。、

Q_PROPERTY

Q_PROPERTY(TYPE p##M MEMBER _p##M NOTIFY p##M##Changed)

## 是宏拼接操作符 

反斜杠 \ 是 C++ 预处理器中的换行符续行符。它用于在宏定义中连接多行代码。使用 \ 可以将长的宏定义分成多行,使代码更具可读性。

这个 Q_PROPERTY 声明会被展开成类似以下的代码:

Q_PROPERTY(int pAge MEMBER _pAge NOTIFY pAgeChanged)

这表示 pAge 是一个 int 类型的属性,实际存储该属性值的成员变量是 _pAge,并且当属性 pAge 发生变化时,会发出 pAgeChanged 信号。

Q_D

  • Q_Q 中的 Q 代表公有类(Public Class)。
  • Q_D 中的 D 代表私有数据(Private Data)。

Q_D指针的原理是将对象的实现放在单独的类(例如MyClassPrivate)中,然后将Q_D指针作为指向该类的单个成员变量存储在主类中。这意味着只有该类可以访问此指针,并且对象的实现可以轻松地更改而无需更改公共接口。

于Q_D指针需要访问QObject的元信息,因此只能与派生自QObject的类一起使用。

在class中配合使用 Q_DECLARE_PRIVATE 和 Q_D ,方便获取d指针,d指针指向Class##Private;

QScopedPointer 是 Qt 提供的一个智能指针类,用于管理动态分配的对象的生命周期。它类似于标准库中的 std::unique_ptr,负责对象的自动释放,以防止内存泄漏。


q指针是在私有数据类中使用的,来获取主类对象指针

#include <QScopedPointer>class MyClassPrivate;
class MyClass : public QObject
{Q_OBJECTQ_DECLARE_PRIVATE(MyClass); //myclass 可以访问private的变量和方法
public:explicit MyClass(QObject *parent = nullptr);~MyClass();void fun();
private:QScopedPointer<MyClassPrivate> d_ptr;// 管理私有数据的智能指针//QScopedPointer 确保在 MyClass 的生命周期结束时自动删除 MyClassPrivate 对象,防止内存泄漏。Q_DISABLE_COPY(MyClass);//防止D的d_ptr指针二次释放

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【深度学习】【语音】TTS,Matcha-TTS,测试效果,训练中文,chinese
  • YOLOv8添加MobileViTv3模块(代码+free)
  • 指针基础知识(笔记)
  • 用uniapp 及socket.io做一个简单聊天app 踢人拉黑 7
  • 2024年计算机类学术会议有哪些
  • 什么是oled?
  • 初识增强现实(AR)
  • ubuntu20从docker安装到制作自己的镜像使用记录
  • leetcode数论(2521. 数组乘积中的不同质因数数目)-质因素分解
  • 垃圾收集器
  • 【Linux】(32)详解命名管道 | 日志管理 | 进程池2.0
  • 基于python的百度迁徙迁入、迁出数据分析(七)
  • C# 报表功能
  • Nginx隐藏欢迎页Welcome to CentOS
  • 百日筑基第四十五天-从JAVA8走到JAVA9
  • $translatePartialLoader加载失败及解决方式
  • css属性的继承、初识值、计算值、当前值、应用值
  • Js基础——数据类型之Null和Undefined
  • php面试题 汇集2
  • SpringCloud集成分布式事务LCN (一)
  • Sublime Text 2/3 绑定Eclipse快捷键
  • thinkphp5.1 easywechat4 微信第三方开放平台
  • VuePress 静态网站生成
  • 理解 C# 泛型接口中的协变与逆变(抗变)
  • 前端 CSS : 5# 纯 CSS 实现24小时超市
  • 前端_面试
  • 什么软件可以剪辑音乐?
  • 使用 Xcode 的 Target 区分开发和生产环境
  • 微服务入门【系列视频课程】
  • 正则与JS中的正则
  • 阿里云重庆大学大数据训练营落地分享
  • # 20155222 2016-2017-2 《Java程序设计》第5周学习总结
  • # Redis 入门到精通(一)数据类型(4)
  • #基础#使用Jupyter进行Notebook的转换 .ipynb文件导出为.md文件
  • $jQuery 重写Alert样式方法
  • (11)工业界推荐系统-小红书推荐场景及内部实践【粗排三塔模型】
  • (13)Hive调优——动态分区导致的小文件问题
  • (C语言)输入自定义个数的整数,打印出最大值和最小值
  • (ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY)讲解
  • (SpringBoot)第七章:SpringBoot日志文件
  • (笔记)M1使用hombrew安装qemu
  • (黑马C++)L06 重载与继承
  • (论文阅读40-45)图像描述1
  • (免费领源码)Java#Springboot#mysql农产品销售管理系统47627-计算机毕业设计项目选题推荐
  • (提供数据集下载)基于大语言模型LangChain与ChatGLM3-6B本地知识库调优:数据集优化、参数调整、Prompt提示词优化实战
  • (转)setTimeout 和 setInterval 的区别
  • .NET Core IdentityServer4实战-开篇介绍与规划
  • .Net Memory Profiler的使用举例
  • .NET 反射 Reflect
  • .NET 中什么样的类是可使用 await 异步等待的?
  • .NET6使用MiniExcel根据数据源横向导出头部标题及数据
  • ::什么意思
  • @Service注解让spring找到你的Service bean
  • [ CTF ]【天格】战队WriteUp- 2022年第三届“网鼎杯”网络安全大赛(青龙组)
  • [000-002-01].数据库调优相关学习