qt基础之d_ptr和q_ptr

d_ptr和q_ptr

d_ptr在QObject中,q_ptr在QObjectData

//QObject
protected:
    QScopedPointer<QObjectData> d_ptr;

//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 QWindow
    uint unused : 25;
    int postedEvents;
    QDynamicMetaObjectData *metaObject;
    QMetaObject *dynamicMetaObject() const;
}
QObjectData
+QObject *q_ptr
+QObject *parent
+QObjectList children
+uint isWidget
+uint blockSig
+uint wasDeleted
+uint isDeletingChildren
+uint sendChildEvents
+uint receiveChildEvents
+uint isWindow
+uint unused
+int postedEvents
+int postedEvents
+QDynamicMetaObjectData *metaObject
QObjectPrivate
+ExtraData *extraData
+QThreadData *threadData
+QObjectConnectionListVector *connectionLists
+Connection *senders
+Sender *currentSender
+mutable quint32 connectedSignals[2]
+QAtomicPointer sharedRefcount
ExtraData
+QVector userData
+QList propertyNames
+QList propertyValues
+QVector runningTimers
+QList > eventFilters
+QList > eventFilters
+QString objectName
QThreadData
-QAtomicInt _ref
+int loopLevel
+QStack eventLoops
+QPostEventList postEventList
+QThread *thread
+HANDLE threadId
+QAtomicPointer eventDispatcher
+QVector tls
+FlaggedDebugSignatures flaggedSignatures
+bool quitNow
+bool canWait
+bool isAdopted
Connection
+QObject *sender
+QObject *receiver
+Connection *nextConnectionList
+Connection *next
+Connection **prev
+QAtomicPointer argumentTypes
+QAtomicInt ref_
+ushort method_offset
+ushort method_relative
+uint signal_index
+ushort connectionType
+ushort isSlotObject
+ushort ownArgumentTypes
Sender
+QObject *sender
+int signal
+int ref
QObjectConnectionListVector

d_ptr:表示类的具体实现类
q_ptr:表示具体实现类的所属类
QObject中的d_ptr是在构造函数时初始化的,同时QObjectPrivate中的d_ptr也会初始化

QObject::QObject(QObject *parent)
    : d_ptr(new QObjectPrivate)
{
    Q_D(QObject);
    d_ptr->q_ptr = this;
    d->threadData = (parent && !parent->thread()) ? parent->d_func()->threadData : QThreadData::current();
    d->threadData->ref();
    if (parent) {
        QT_TRY {
            if (!check_parent_thread(parent, parent ? parent->d_func()->threadData : 0, d->threadData))
                parent = 0;
            setParent(parent);
        } QT_CATCH(...) {
            d->threadData->deref();
            QT_RETHROW;
        }
    }
    if (Q_UNLIKELY(qtHookData[QHooks::AddQObject]))
        reinterpret_cast<QHooks::AddQObjectCallback>(qtHookData[QHooks::AddQObject])(this);
    Q_TRACE(QObject_ctor, this);
}

相关宏

Q_DECLARE_PRIVATE:在具体实现类的所属类中使用,表示获取对应的私有实现类的指针,同时将私有实现类声明为友元的
Q_DECLARE_PRIVATE_D:在Q_DECLARE_PRIVATE基础上指定了私有实现指针
Q_D:是对Q_DECLARE_PRIVATE中定义的d_func的调用

#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;
#define Q_DECLARE_PRIVATE_D(Dptr, Class) \
    inline Class##Private* d_func() \
    { Q_CAST_IGNORE_ALIGN(return reinterpret_cast<Class##Private *>(qGetPtrHelper(Dptr));) } \
    inline const Class##Private* d_func() const \
    { Q_CAST_IGNORE_ALIGN(return reinterpret_cast<const Class##Private *>(qGetPtrHelper(Dptr));) } \
    friend class Class##Private;
    
#define Q_D(Class) Class##Private * const d = d_func()

Q_DECLARE_PUBLIC:定义了q_func普通指针和常指针版本的函数,返回私有类的所属类,同时声明所属为在友元类
Q_Q:对Q_DECLARE_PUBLIC中定义的q_func函数的调用

#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;

#define Q_Q(Class) Class * const q = q_func()

你可能感兴趣的:(Qt,qt,开发语言)