クラスオブジェクトのメンバー関数の情報を取得するためのQtリフレクションメカニズム2

1.QMetaMethodクラス

①関数:オブジェクトのメンバー関数を記述するために使用され、このクラスのメンバー関数を使用して、オブジェクトのメンバー関数の情報を取得できます。
②このクラスのメンバーは次のとおりです
。enumMethodType{Method、Signal、Slot、Constructor}
この列挙型は、関数のタイプ、つまり通常のメンバー関数(Method)、signal(Signal)、slot(Slot)、コンストラク
ターコンストラクター。
enumAccess(Private、Protected、Public)
この列挙型は、主に関数のアクセスレベル(private、protected、public)を記述するために使用されます
。QByteArraymethodSignature()const; //関数の署名を返します(qt5.0)
MethodTypemethodType()const; //戻り関数のタイプ(シグナル、スロット、メンバー関数、コンストラクター)
QByteArrayname()const; //戻り関数の名前(qt5.0)

int parameterCount()const; //関数パラメーターの数を返します(qt5.0)
QList<QByteArray> parameterNames()const;関数パラメーター名のリストを返します。
intparameterType(int index)const;
指定されたインデックスのパラメータータイプを返します。戻り値はQMetaTypeに登録されている型です。型が登録されていない場合
、戻り値はQMetaType :: UnknownTypeです。
QList<QByteArray> parameterTypes()const;関数パラメータータイプのリストを返します。
intreturnType()const;
関数の戻り値の型を返します。戻り値はQMetaTypeに登録されている型です。型が登録されていない場合、戻り
値はQMetaType :: UnknownTypeです。
constchar* typeName()const;関数の戻り値の型の名前を返します。
Accessaccess()const;関数のアクセスレベル(private、protected、public)を返します

2.クラスオブジェクトのメンバー関数を取得するためのQMetaObjectクラスの関数は次のとおりです。

①、int indexOfMethod(const char * f)const;
fという名前の関数のインデックス番号を返します。それ以外の場合は、-1を返します。関数の形状など、正しい関数シグネチャをここに入力する必要があります

式はvoidf(int i、int j);正しい形式はxx.indexOfMethod( "f(int、int");次の形式は
正しい形式ではありません"f(int i、int j)"、 " void f(int、int) "、" f "、" void f "など
。②、int indexOfSignal(const char * s)const;
信号sのインデックス番号を返しますそれ以外の場合は、指定されている場合は-1を返します。関数は存在しますが、シグナルではなく、-1を返します
。③、int indexOfConstructor(const char * c)const; //コンストラクタcのインデックス番号を返します。それ以外の場合は-1④を返します。intconstructorCount
() const; //コンストラクターの数を返します
。⑤、QMetaMethodコンストラクター(int i)const;指定されたインデックスiにあるコンストラクターのメタデータを返します
。⑥、int methodCount()const;
関数、シグナルを含む関数の数を返します、slotsおよび基本クラスの通常のメンバー関数
。ر、int methodOffset()const;
は、親クラスのすべての関数の合計を返しますつまり、戻り値は、クラスの最初のメンバー関数の
インデックス位置です。
⑧、QMetaMethod法(INT I)のconst;戻り値インデックスiの関数のメタデータを指定します。

 

#ifndef M_H //要使用元对象系统,需在头文件中定义类。
#define M_H
#include<QObject> //因为要使用QObject 类,为此需要包含此头文件
class A:public QObject
{
Q_OBJECT //启动元对象系统,必须声明此宏
public:
//定义2 个构造函数、1 个信号、3 个函数。
Q_INVOKABLE A(){} //要想函数被反射,需要指定Q_INVOKABLE 宏。
Q_INVOKABLE A(int){}
Q_INVOKABLE void f(){}
Q_INVOKABLE void g(int i,float j){}
void g1(){} //注意:此函数不会被反射。
signals: void gb3();
 };
class B:public A
{
Q_OBJECT //要使用元对象系统,应在每个类之中都声明此宏
public:
//定义1 个函数、2 个信号
Q_INVOKABLE void f(){}
signals: void gb4(); void gb5();
 };
#endif // M_H
#include "m.h"
#include <QMetaMethod>
#include <QByteArray>
#include <iostream>
using namespace std;
int main()
{ A ma; B mb; //创建两个对象
const QMetaObject *pa=ma.metaObject();
const QMetaObject *pb=mb.metaObject();
//以下为通过QMetaObject 的成员函数获取的信息。
int j=pa->methodCount(); /*返回对象ma 中的成员函数数量,包括从父类QObject 继承而来的5 个
成员函数及本对象中的2 个成员函数(注意,不包括g1)、1 个信号,所以
总数为8。*/
cout<<j<<endl; //输出8
int i=pa->indexOfMethod("g(int,float)"); //获取对象ma 中的成员函数g 的索引号。
cout<<i<<endl; //输出7
i=pa->constructorCount(); //获取对象ma 所属类中的构造函数的数量。
cout<<i<<endl; //输出2
i=pb->constructorCount(); /*获取对象mb 所属类B 中的构造函数的数量,因类B 无构造函数,所以
返回值为0,此处也可看到,构造函数数量不包含父类的构造函数*/
cout<<i<<endl; //输出0。
i=pa->indexOfConstructor("A(int)"); //获取对象ma 所属类中的构造函数A(int)的索引号。
cout<<i<<endl; //输出1。
i=pa->indexOfSignal("gb3()"); //获取对象ma 的信号gb3()的索引号。
cout<<i<<endl; //输出5。
i=pa->indexOfSignal("f()"); /*获取对象ma 的信号f()的索引号。因为成员函数f 存在,但不是信
号,所以返回值为-1。*/
cout<<i<<endl; //输出-1。
i=pb->methodOffset(); /*获取父类的成员函数数量,包括父类A 及QObject 中的成员函数,总共为8。
*/
cout<<i<<endl; //输出8,此处相当于是对象mb 自身成员函数开始处的索引号。
//以下为通过QMetaMethon 的成员函数获取的信息。
//获取对象ma 的成员函数g 的元数据。
QMetaMethod m=pa->method(pa->indexOfMethod("g(int,float)"));
QByteArray s= m.name(); //获取成员函数g 的函数名。
cout<<s.data()<<endl; //输出g
s=m.methodSignature(); //获取函数g 的签名
cout<<s.data()<<endl; //输出g(int,float)
i=m.methodType(); /*获取函数g 的类型,此处返回的是QMetaMethod::MethodType 中定义的枚举值,
其中Method=0,表示类型为成员函数*/
cout<<i<<endl; //输出0(表示成员函数)。
//以下信息与函数的返回类型有关
s=m.typeName(); //获取函数g 的返回值的类型名
cout<<s.data()<<endl; //输出void
i=m.returnType(); /*获取函数g 返回值的类型,此处的类型是QMetaType 中定义的枚举值,其中枚举
值QMetaType::void=43*/
cout<<i<<endl; //输出43
//以下信息与函数的参数有关
i=m.parameterType(1); /*获取函数g 中索引号为1 的参数类型,此处的类型是QMetaType 中定义的
枚举值,其中枚举值QMetaType::float=38*/
cout<<i<<endl; //输出38
QList<QByteArray> q=m.parameterNames(); //获取函数g 的参数名列表
cout<<q[0].data()<<q[1].data()<<endl; //输出ij
q=m.parameterTypes(); //获取函数g 的参数类型列表。
cout<<q[0].data()<<q[1].data()<<endl; //输出intfloat
return 0; 
}

 

おすすめ

転載: blog.csdn.net/weixin_41882459/article/details/114027096