Qt的q指针和d指针笔记

原因:只要Qt内部增加/删除/修改/改变顺序/改变类型任何一个私有成员,所有使用Qt的程序都必须重新编译,否则会出现未定义行为(内存错位、崩溃等)。
d指针指向的私有数据专门有相应头文件 qwidget_p.h(其中p:private)来定义。
1、类定义d指针

cpp 复制代码
class Q_CORE_EXPORT QObject
{
    Q_OBJECT
    Q_PROPERTY(QString objectName READ objectName WRITE setObjectName NOTIFY objectNameChanged)
    Q_DECLARE_PRIVATE(QObject)
...
    QScopedPointer<QObjectData> d_ptr;
...
}

1.1、Q_DECLARE_PRIVATE定义

cpp 复制代码
#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(MyWidget)展开

cpp 复制代码
inline MyWidgetPrivate* d_func()
{ 
    Q_CAST_IGNORE_ALIGN(return reinterpret_cast<MyWidgetPrivate *>(qGetPtrHelper(d_ptr));) 
}

inline const MyWidgetPrivate* d_func() const
{ 
    Q_CAST_IGNORE_ALIGN(return reinterpret_cast<const MyWidgetPrivate *>(qGetPtrHelper(d_ptr));)
} 
friend class MyWidgetPrivate;

1.2、 QObjectData定义

cpp 复制代码
class Q_CORE_EXPORT QObjectData {  // 这是一个接口类
public:
    virtual ~QObjectData() = 0; //纯虚函数
    QObject *q_ptr;
    QObject *parent;
    QObjectList children;

    uint isWidget : 1;
    uint blockSig : 1;
    uint wasDeleted : 1;
    uint isDeletingChildren : 1;
    uint sendChildEvents : 1;
    uint receiveChildEvents : 1;
    uint isWindow : 1; //for QWindow
    uint deleteLaterCalled : 1;
    uint unused : 24;
    int postedEvents;
    QDynamicMetaObjectData *metaObject;
    QMetaObject *dynamicMetaObject() const;
};

class Q_WIDGETS_EXPORT QWidgetPrivate : public QObjectPrivate qwidget_p.h(其中p:private,经常会变化的部分提取出来)
class Q_CORE_EXPORT QObjectPrivate : public QObjectData qobject_p.h(其中p:private,经常会变化的部分提取出来)
2、私有类定义q指针 (继承了 QObjectData中定义了 QObject *q_ptr

cpp 复制代码
class Q_CORE_EXPORT QObjectPrivate : public QObjectData
{
    Q_DECLARE_PUBLIC(QObject)
public:
...

Q_DECLARE_PUBLIC定义

cpp 复制代码
#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(QObject)宏展开

cpp 复制代码
inline QObject* q_func() { return static_cast<QObject *>(q_ptr); } \
inline const QObject* q_func() const { return static_cast<const QObject *>(q_ptr); } \
friend class QObject;
相关推荐
郑同学zxc14 小时前
机器视觉10-Qt联合Halcon开发环境配置
开发语言·qt
踏过山河,踏过海18 小时前
qt设置exe图标
qt
yangpipi-19 小时前
PyQt5快速开发与实战 第3章 QtDesigner
开发语言·qt
来鸟 鸣间20 小时前
Qt 组件安装
qt
csdn_zhangchunfeng1 天前
QML之解决GaussianBlur部分区域出现锯齿
前端·javascript·qt
开始了码1 天前
如何打包qt项目为.exe
开发语言·qt
来鸟 鸣间1 天前
Qt creator快捷键
qt
草莓熊Lotso1 天前
Qt 对话框全家桶实战:模态 / 非模态 + 5 大内置对话框全攻略
运维·c语言·开发语言·c++·人工智能·qt·ui
江公望1 天前
Qt QJsonDocument 10分钟讲清楚
开发语言·qt
wybarcelona2 天前
windows下使用Qt Creator开发调试的注意事项
开发语言·qt