Qt的元对象系统
元对象系统功能:
- 对象间的信号和槽机制。
- 运行时类型信息和动态属性系统。
使用元对象需要满足的条件
-
必须继承自QOBJECT
-
在类声明区域添加Q_OBJECT宏。用于启动原对象特性。
-
元对象编译器(MOC)为每个Qobject的子类,提供实现元对象特性所必须的代码。
元对象的反射机制
-
反射机制指的是在运行时,能获取任意一个对象的所有类型、属性和成员函数等信息的一种机制。
-
QT中使用一系列类来实现反射机制。其中QMetaObject类描述了QObject及其派生类的所有元信息。因此QMetaObject类的对象是QT中的元对象。
-
比如成员函数使用QMetaMethod进行描述。
QMetaMethod qm = metaObject->method(1); //获取索引为 1 的成员函数
使用反射机制的条件
-
需要继承自QObject 并且在类中加入Q_OBJECT宏
-
如果希望普通函数能够被反射,需要在函数声明之前添加QObject::Q_INVOKABLE宏
Q_INVOKABLE A(){} //要想函数被反射,需要指定 Q_INVOKABLE 宏。
-
如果希望成员变量能够被反射,需要使用Q_PROPERTY宏定义
使用反射机制获取类对象的常用成员函数
-
QMetaMethon 类
函数 功能 QByteArray methodSignature() const; 返回函数签名 MethodType methodType() const; 返回函数类型(信号 槽 成员函数 构造函数) QByteArray name() const; 函数名称 int parameterCount() const ; 返回参数个数 QList parameterNames() const; 返回参数名称列表 int parameterType(int index) const; 返回指定索引参数类型 QList parameterTypes() const; 返回参数类型列表 int returnType() const; 返回值的类型 const char * typeName() const; 返回值类型的名称 Access access() const; 返回函数的访问级别 -
QMetaObject类
函数 功能 int indexOfMethod(const char* f) const; 返回函数的索引 int indexOfSignal(const char * s) const; 返回信号的索引 int indexOfConstructor(const char *c) const; 构造函数的索引 int constructorCount() const ; 返回构造函数的数量 QMetaMethod constructor(int i)const; 返回指定构造函数的的元数据 int methodCount() const; 返回函数的数量 QMetaMethod method(int i) const; 返回指定索引i的元数据 const char* className() const; 返回类的名称 const QMetaObject* superClass() const; 返回父对象的元数据