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;
相关推荐
问君能有几多愁~1 小时前
Qt Json 序列化操作
开发语言·qt·json
平常心的技术小牛1 小时前
Qt-快速上手-QFileDialog
windows·qt·microsoft
小小龙学IT2 小时前
Qt Graphics View Framework(图形视图框架)深度解析:从 Scene/View/Item 到工业级 2D 场景
开发语言·数据库·qt
程与留2 小时前
09_Qt 布局管理系统——QHBoxLayout、QVBoxLayout、QGridLayout
c++·qt
神仙别闹2 小时前
基于QT(C++)实现旅游线路规划系统
c++·qt·旅游
≮傷£≯√2 小时前
音量调节弹窗 自定义组件qt
开发语言·qt
小小龙学IT15 小时前
Qt 6 跨平台开发完全指南:从信号槽机制到实际项目落地
开发语言·qt
丰锋ff18 小时前
基于 Qt 的智能门禁系统
qt·学习
我不是疯子是傻子1 天前
用 DeepSeek 将 Modbus 协议文档自动化为 Qt 枚举与寄存器结构体?「文档解析+AI生成+编译验证」的代码工厂实践
人工智能·qt·自动化
程与留1 天前
08_对话框系统全解析——模态非模态、QMessageBox、QFileDialog
c++·qt