Qt中的Q_D宏和d指针

  Q_D的设置意在方便地获取私有类指针,文件为qglobal.h。

1 #define Q_D(Class) Class##Private * const d = d_func()

  d_func()函数如下实现:

1 #define Q_DECLARE_PRIVATE(Class) 2     inline Class##Private* d_func() { return reinterpret_cast<Class##Private *>(qGetPtrHelper(d_ptr)); } 3     inline const Class##Private* d_func() const { return reinterpret_cast<const Class##Private *>(qGetPtrHelper(d_ptr)); } 4     friend class Class##Private;

  这里的d_func()虽然在宏里面,但是如果代入具体的类型,这里面就变成了以Class##Private的私有类指针为返回值,以func为函数名的函数。这里的qGetPtrHelper是

1 template <typename T> static inline T *qGetPtrHelper(T *ptr) { return ptr; }

  这个模板函数里面里的T要套入Class##Private这个具体的类。上面的那个Q_DECLARE_PRIVATE里面的就成了这个模板类的一个声明。

  在QObject类里面存在一个成员变量,d_ptr指针,定义如下:

1     QScopedPointer<QObjectData> d_ptr;

原文地址:https://www.cnblogs.com/microthink/p/9281848.html

时间: 2024-08-30 14:44:00

Qt中的Q_D宏和d指针的相关文章

Qt中如何用指针返回参数

问题:在qt中写一个方法,用指针做返回值,编译没有问题,但执行的时候程序会报错. 我的操作步骤: 1.新建一个Test的测试类,内容如下: Test.h Test.cpp 2.main方法去调用Test类中void fun(QString* pStr)方法,如下,程序编译执行一下,没有问题 3.接下来,打印一下main方法中参数pStr1的内容,理论下*pStr1的值会是"123456",然后并非如此,如下图,编译时没有报错,而执行的时候程序报错了: 4.从步骤2到步骤3可以看出,代码

C++在使用Qt中SLOT宏须要注意的一个小细节

大家都知道C++虚函数的机制,对于基类定义为虚函数的地方,子类假设覆写,在基类指针或者引用来指向子类的时候会实现动态绑定. 但假设指针去调用非虚函数,这个时候会调用C++的静态绑定,去推断当前的指针是什么类型,就去运行哪个类型的函数. 非常有一种比較经典的使用方法,就是Template Method模式,基类定义一个非虚的算法框架,里面详细定义一些纯虚的函数片段,由子类来进行实现,从而实现了控制整体框架,但能够给客户自由定制的灵活性.这个使用方法事实上就是指针去调用了基类的方法,由方法的扩展之后

C++在使用Qt中SLOT宏需要注意的一个小细节

大家都知道C++虚函数的机制,对于基类定义为虚函数的地方,子类如果覆写,在基类指针或者引用来指向子类的时候会实现动态绑定. 但如果指针去调用非虚函数,这个时候会调用C++的静态绑定,去判断当前的指针是什么类型,就去执行哪个类型的函数. 很有一种比较经典的用法,就是Template Method模式,基类定义一个非虚的算法框架,里面具体定义一些纯虚的函数片段,由子类来进行实现,从而实现了控制总体框架,但可以给客户自由定制的灵活性.这个用法其实就是指针去调用了基类的方法,由方法的扩展之后扩展到虚函数

Qt中单例模式的实现(4种方法)

最简单的写法: 12345 static MyClass* MyClass::Instance(){ static MyClass inst; return &inst;} 过去很长一段时间一直都这么写,简单粗暴有效.但是直接声明静态对象会使编译出的可执行文件增大,也有可能出现其他的一些问题,所以利用了Qt自带的智能指针QScopedPointer和线程锁QMutex,改成了需要时才动态初始化的模式: 12345678910111213 static MyClass* MyClass::Inst

Qt中如何 编写插件 加载插件 卸载插件

Qt中如何 编写插件 加载插件 卸载插件是本文要介绍的内容.Qt提供了一个类QPluginLoader来加载静态库和动态库,在Qt中,Qt把动态库和静态库都看成是一个插件,使用QPluginLoader来加载和卸载这些库.由于在开发项目的过程中,要开发一套插件系统,就使用了Qt的这套类库. 一 编写插件 编写一个Qt的插件需要以下步骤 1.声明一个插件类, 2.定义一个类,实现这个插件类定义的接口,定义的这个类必须从QObject集成下来. 3.使用Q_INTERFACESQ_INTERFACE

【转载】Qt中的QString,QByteArray,Qchar, char*

先要说的是QString. 之所以把QString单独拿出来,是因为string是很常用的一个数据结构,甚至在很多语言中,比如JavaScript,都是把string作为一种同int等一样的基本数据结构来实现的. 每一个GUI程序都需要string,这些string可以用在界面上的提示语,也可以用作一般的数据结构.C++语言提供了两种字符串的实现:C风格的 字符串,以'\0‘结尾:std::string,即标准模版库中的类.Qt则提供了自己的字符串实现:QString.QString以16位 U

深度解析 Qt 中动态链接库

本文介绍的是Qt 中动态链接库,现在有些软件有自动升级功能,有些就是下载新的DLL文件,替换原来的动态链接库,MFC好象也有类似机制,Qt还有一种方式,就是把一个QWidget子类,编译成动态链接库.然后根据动态链接库创建一个对象,返回QWidget子针,如果你的类不是QWidget的子类,就不能用这种方法了. QLibrary也是用来加载动态链接库,但它创建出来返回的是某个"方法的指针"(不需要头文件),而QPluginLoader创建返回的是"对象的指针"(对象

libCURL在Qt中的使用

最近业余时间在搞Qt,其中的一个功能是实现FTP的上传下载. 之前版本的Qt提供了一个FTP操作的类,但是5.x(4.x?)之后因为性能问题就弃用了.貌似CSDN上有人发帖问过这个问题,记得应该是put多大的文件时导致占用内存过大.现在Qt的官方手册推荐使用QNetworkAccessManager用于TCP/IP以及FTP的传输.说实话这玩意对于FTP的兼容并不好.于是想到了CURL. 网上关于CURL和libCURL的文章很多,但是用于FTP操作的文章大多数停留于试验性的代码.别的不说,忽略

Qt 中的二进制兼容策略(简而言之就是地址不能变,剩下的就是让地址不变的技巧)

本文翻译自 Policies/Binary Compatibility Issues With C++ 二进制兼容的定义 如果程序从一个以前版本的库动态链接到新版本的库之后,能够继续正常运行,而不需要重新编译,那么我们就说这个库是二进制兼容的. 如果一个程序需要重新编译来运行一个新版本的库,但是不需要对程序的源代码进一步的修改,这个库就是源代码兼容的. 二进制兼容性可以节省很多麻烦.这使得为特定平台分发软件变得更加容易.如果不确保版本之间的二进制兼容性,人们将被迫提供静态链接的二进制文件.静态二