qt之元对象系统

文章介绍了Qt框架中的QObject类,它是所有使用元对象系统类的基类。Q_OBJECT宏使得类能利用元对象特性,如动态属性和信号与槽机制。MOC(元对象编译器)为QObject子类生成必要的代码。QMetaObject定义了类的元数据,包括方法、属性和枚举等。
摘要由CSDN通过智能技术生成

组成

  • QObject类:是所有使用元对象系统的类的基类
  • Q_OBJECT宏:使得类可以使用元对象的特性,如动态属性,信号与槽
  • MOC:元对象编译器,为每个QObject的子类提供必要的代码来实现元对象系统的属性

QMetaObject定义在src/qtbase/corelib/kernel/qobjectdefs.h中

QObject
QMetaObject
QMetaMethod
QMetaEnum
QMetaProperty
QMetaClassInfo
QMetaObjectPrivate
+int revision
+int className
+int classInfoCount
+int classInfoData
+int methodCount
+int methodData
+int propertyCount
+int propertyData
+int enumeratorCount
+int enumeratorData
+int constructorCount
+int constructorData
+int flags
+int signalCount
struct
+SuperData superdata
+const QByteArrayData *stringdata
+const uint *data
+StaticMetacallFunction static_metacall
+const SuperData *relatedMetaObjects
+void *extradata

struct中data数组头部存放的是QMetaObjectPrivate数据信息

struct OMetaObjectPrivate
{
	int revision;
	int className;
	int classInfoCount, classInfoData;
	int methodCount, methodData;
	int propertyCount, propertyData;
	int enumeratorCount, enumeratorData;
	int constructorCount, constructorData;
	int flags;
	int signalCount;
};

struct中static_metacall是信号或者槽函数调用的分发,由moc来生成
struct中的stringdata存放的是类的信息,比如类名,信号以及槽函数签名,以及每一项在字符串的中偏移信息

struct { // private data
        SuperData superdata;
        const QByteArrayData *stringdata;
        const uint *data;
        typedef void (*StaticMetacallFunction)(QObject *, QMetaObject::Call, int, void **);
        StaticMetacallFunction static_metacall;
        const SuperData *relatedMetaObjects;
        void *extradata; //reserved for future use
    } d;

static_metacall:设置为moc生成对象的qt_static_metacall方法

Q_OBJECT

宏定义了类中与元对象相关的部分,其定义如下

#define Q_OBJECT \
public: \
    QT_WARNING_PUSH \
    Q_OBJECT_NO_OVERRIDE_WARNING \
    static const QMetaObject staticMetaObject; \  //静态元对象
    virtual const QMetaObject *metaObject() const; \  //获取类关联的元对象
    virtual void *qt_metacast(const char *); \ //元对象转换
    virtual int qt_metacall(QMetaObject::Call, int, void **); \  //元对象方法调用 
    QT_TR_FUNCTIONS \
private: \
    Q_OBJECT_NO_ATTRIBUTES_WARNING \
    Q_DECL_HIDDEN_STATIC_METACALL static void qt_static_metacall(QObject *, QMetaObject::Call, int, void **); \
    QT_WARNING_POP \
    struct QPrivateSignal {}; \
    QT_ANNOTATE_CLASS(qt_qobject, "")

#define QT_TR_FUNCTIONS \ //翻译字符串,用于多语言
    static inline QString tr(const char *s, const char *c = nullptr, int n = -1) \
        { return staticMetaObject.tr(s, c, n); } \
    QT_DEPRECATED static inline QString trUtf8(const char *s, const char *c = nullptr, int n = -1) \
        { return staticMetaObject.tr(s, c, n); }

metaObject:方法会返回staticMetaObject
qt_metacall:会调用qt_static_metacall

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kgduu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值