QObjectPrivate 是QObject的d_ptr指针

QObject.h

class Q_CORE_EXPORT QObject{protected:QObject(QObjectPrivate &dd, QObject *parent = nullptr);protected:QScopedPointer<QObjectData> d_ptr;
}

QObject.cpp

QObject::QObject(QObject *parent): d_ptr(new QObjectPrivate)
{Q_D(QObject);d_ptr->q_ptr = this;

class QObjectData


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 QWindowuint deleteLaterCalled : 1;uint unused : 24;int postedEvents;QDynamicMetaObjectData *metaObject;QMetaObject *dynamicMetaObject() const;
};

class QObjectPrivate

class Q_CORE_EXPORT QObjectPrivate : public QObjectData
{Q_DECLARE_PUBLIC(QObject)public:struct ExtraData{ExtraData() {}#ifndef QT_NO_USERDATAQVector<QObjectUserData *> userData;#endifQList<QByteArray> propertyNames;QVector<QVariant> propertyValues;QVector<int> runningTimers;QList<QPointer<QObject> > eventFilters;QString objectName;};typedef void (*StaticMetaCallFunction)(QObject *, QMetaObject::Call, int, void **);struct Connection{QObject *sender;QObject *receiver;union {StaticMetaCallFunction callFunction;QtPrivate::QSlotObjectBase *slotObj;};// The next pointer for the singly-linked ConnectionListConnection *nextConnectionList;//senders linked listConnection *next;Connection **prev;QAtomicPointer<const int> argumentTypes;QAtomicInt ref_;ushort method_offset;ushort method_relative;uint signal_index : 27; // In signal range (see QObjectPrivate::signalIndex())ushort connectionType : 3; // 0 == auto, 1 == direct, 2 == queued, 4 == blockingushort isSlotObject : 1;ushort ownArgumentTypes : 1;Connection() : nextConnectionList(nullptr), ref_(2), ownArgumentTypes(true) {//ref_ is 2 for the use in the internal lists, and for the use in QMetaObject::Connection}~Connection();int method() const { Q_ASSERT(!isSlotObject); return method_offset + method_relative; }void ref() { ref_.ref(); }void deref() {if (!ref_.deref()) {Q_ASSERT(!receiver);delete this;}}};// ConnectionList is a singly-linked liststruct ConnectionList {ConnectionList() : first(nullptr), last(nullptr) {}Connection *first;Connection *last;};struct Sender{QObject *sender;int signal;int ref;};QObjectPrivate(int version = QObjectPrivateVersion);virtual ~QObjectPrivate();void deleteChildren();void setParent_helper(QObject *);void moveToThread_helper();void setThreadData_helper(QThreadData *currentData, QThreadData *targetData);void _q_reregisterTimers(void *pointer);bool isSender(const QObject *receiver, const char *signal) const;QObjectList receiverList(const char *signal) const;QObjectList senderList() const;void addConnection(int signal, Connection *c);void cleanConnectionLists();static inline Sender *setCurrentSender(QObject *receiver,Sender *sender);static inline void resetCurrentSender(QObject *receiver,Sender *currentSender,Sender *previousSender);static QObjectPrivate *get(QObject *o) {return o->d_func();}static const QObjectPrivate *get(const QObject *o) { return o->d_func(); }int signalIndex(const char *signalName, const QMetaObject **meta = nullptr) const;inline bool isSignalConnected(uint signalIdx, bool checkDeclarative = true) const;inline bool isDeclarativeSignalConnected(uint signalIdx) const;// To allow abitrary objects to call connectNotify()/disconnectNotify() without making// the API public in QObject. This is used by QQmlNotifierEndpoint.inline void connectNotify(const QMetaMethod &signal);inline void disconnectNotify(const QMetaMethod &signal);template <typename Func1, typename Func2>static inline QMetaObject::Connection connect(const typename QtPrivate::FunctionPointer<Func1>::Object *sender, Func1 signal,const typename QtPrivate::FunctionPointer<Func2>::Object *receiverPrivate, Func2 slot,Qt::ConnectionType type = Qt::AutoConnection);template <typename Func1, typename Func2>static inline bool disconnect(const typename QtPrivate::FunctionPointer<Func1>::Object *sender, Func1 signal,const typename QtPrivate::FunctionPointer<Func2>::Object *receiverPrivate, Func2 slot);static QMetaObject::Connection connectImpl(const QObject *sender, int signal_index,const QObject *receiver, void **slot,QtPrivate::QSlotObjectBase *slotObj, Qt::ConnectionType type,const int *types, const QMetaObject *senderMetaObject);static QMetaObject::Connection connect(const QObject *sender, int signal_index, QtPrivate::QSlotObjectBase *slotObj, Qt::ConnectionType type);static bool disconnect(const QObject *sender, int signal_index, void **slot);
public:ExtraData *extraData;    // extra data set by the userQThreadData *threadData; // id of the thread that owns the objectQObjectConnectionListVector *connectionLists;Connection *senders;     // linked list of connections connected to this objectSender *currentSender;   // object currently activating the objectmutable quint32 connectedSignals[2];union {QObject *currentChildBeingDeleted; // should only be used when QObjectData::isDeletingChildren is setQAbstractDeclarativeData *declarativeData; //extra data used by the declarative module};// these objects are all used to indicate that a QObject was deleted// plus QPointer, which keeps a separate listQAtomicPointer<QtSharedPointer::ExternalRefCountData> sharedRefcount;
};

请注意成员变量:
ExtraData *extraData; // extra data set by the user
QThreadData *threadData; // id of the thread that owns the object
QObjectConnectionListVector *connectionLists;
Connection *senders; // linked list of connections connected to this object
Sender *currentSender; // object currently activating the object
mutable quint32 connectedSignals[2];

6. Qt 信号与信号槽 (5)-QObjectPrivate相关推荐

  1. Qt::ConnectionType(信号与槽的传递方式)

    Qt::AutoConnection 自动连接:(默认值)如果信号在接收者所依附的线程内发射,则等同于直接连接.如果发射信号的线程和接受者所依附的线程不同,则等同于队列连接. Qt::DirectCo ...

  2. Qt for Python 信号和槽的使用详解

    前言 如果要说 Qt 里面的最常听到的词,那么 "信号"(signals)和"槽"(slots)绝对是其中之一了,其功能简单强大,想必每个 Qt 程序员最能理解 ...

  3. qt 关闭窗口的槽函数_勇哥的VC++应用框架学习之QT(1) 信号槽、按钮控件、opencv读取显示图片...

    前言勇哥对于C语言,C++早些年有一些接触,这个系列贴子就记载一下C++应用框架的学习经验. 在写程序时,UI.基础类库.应用程序框架对于vc来讲,只能依靠MFC和QT了. 勇哥对MFC有很强的抵触, ...

  4. QT中信号和信号槽详解

    如何选择QDialogButtonBox的信号与槽 1.UI中设计了一个QDialogButtonBox,按钮为Cancel和Apply: 2.构造函数连接: connect(ui->butto ...

  5. Qt eventFilter实现信号与槽

    对于Qt来说,信号与槽机制是其通信的一大亮点,但是Qt中也提供了其他的方法实现数据间的通信,如invokeMethod反射机制实现通信(https://blog.csdn.net/xx18030637 ...

  6. Qt工作笔记-信号与槽参数匹配问题

    今天,我把Qt3代码转化为Qt5,控件啥的都要换,李主任说了下为什么以前的信号和槽函数参数不匹配!!这句话让我对Qt中的信号与槽进一步有了了解. 下面的这个演示源码是基于这个博客的 https://b ...

  7. [转载]qt信号signal和槽slot机制

    好东西! 原文地址:qt信号signal和槽slot机制作者:fox1987 信号与槽作为QT的核心机制在QT编程中有着广泛的应用,本文介绍了信号与槽的一些基本概念.元对象工具以及在实际使用过程中应注 ...

  8. 【Qt教程】1.6 - Qt5信号与槽、Single Slot emit、自定义信号、自定义槽

    信号与槽 1. 说明 概念:信号和槽,是Qt对象间通信的接口.信号Signal.槽Slot,分别对应着事件的发送端和接受端. 语法: connect( 信号的发送者, 发送的具体信号, 信号的接收者, ...

  9. Qt线程间信号槽传递自定义数据类型(qRegisterMetaType的使用)

    Qt线程间信号槽传递自定义数据类型(qRegisterMetaType的使用) #include <QMetaType> CFileDataModel::CFileDataModel(QO ...

  10. Qt的特性——信号和槽

    Qt的特性--信号和槽 1. Qt的特性 2. 信号和槽 2.1 信号和槽机制概述 2.2 典型应用示例 2.3 信号和槽的关联 2.4 断开关联 2.5 信号和槽的高级应用 1. Qt的特性 Qt在 ...

最新文章

  1. 使用Electron制作一个快速搜索应用(入门向)
  2. python -- leetcode 刷题之路
  3. Inchat时代真的来了?上线一周突破百万用户
  4. Tomcat一些小事
  5. 前端页面高度和宽度自适应怎么做?
  6. MySQL关联left join 条件on与where不同
  7. bash下个人习惯的一些文件设置
  8. 如何在VS和CB中配置MySQL环境
  9. NEBULA超级计算机,科学网—中国“星云”或将称霸全球超级计算机500强
  10. window下的SCROLLbar的使用技巧
  11. 「leetcode」452. 用最少数量的箭引爆气球【贪心算法】详细图解
  12. python图片分类毕业设计成果报告书_毕业设计成果报告书.pdf
  13. 超轻量级Web安全漏洞扫描工具Netsparker使用教程介绍
  14. 28款超级绿色版杀软,奉献给各位!【迅雷下载】
  15. 宇视手机客户端共享/分享设备配置操作
  16. 怎么给word文档注音_Word文档怎么添加拼音给文字注音
  17. 批量解析域名为IP地址的shell脚本和python脚本
  18. 利用window的CLSID可以干的一些事情
  19. 计算机工作组环境和域环境的区别
  20. 应对机器学习中类不平衡的10种技巧

热门文章

  1. date oracle 表中_从 MySQL 迁移数据到 Oracle 中的全过程
  2. 数据中心系统管理员基础知识培训
  3. 微软停止与华为合作:Windows暂停供应新订单
  4. shell开启飞行模式_手机上的飞行模式,每天都能用得上,我是才知道,涨知识...
  5. 票务系统思维导图_最全思维导图分享,告诉你如何系统的学好软件测试。
  6. Interview:算法岗位面试—10.31下午上海某银行总部公司(二面,四大行之一)之项目简介、比赛介绍、某个比赛的过程
  7. NLP之NBGBT:基于朴素贝叶斯(count/tfidf+网格搜索+4fCrva)、梯度提升树(w2c+网格搜索+4fCrva)算法对IMDB影评数据集进行文本情感分析(情感二分类预测)
  8. Matlab:盲反卷积还原失焦图像
  9. 成功解决解决VM软件安装Linux的Ubuntu过程,开启Linux出现Oprating System not found错误
  10. 关于Python课程