クラスに関連する情報を取得するためのQtリフレクションメカニズム3

1.クラス関連情報を取得するためのQMetaObjectクラスのメンバー関数は次のとおりです。

const char * className()const;
クラスの名前を取得します。QObjectのサブクラスがメタオブジェクトシステムを開始しない場合(つまり、Q_OBJECT
マクロが使用されない場合)、この関数は最も近い開始を取得することに注意してください。クラスのメタオブジェクトシステムの親クラスの名前は返されなくなりました
。したがって、すべてのQObjectサブクラスでQ_OBJECTマクロを使用することをお勧めします。
const QMetaObject * superClass()const;
//親クラスのメタオブジェクトを返します。そのようなオブジェクトがない場合は0を返します。
 bool Heritages(const QMetaObject * mo)const;(Qt5.7)
//クラスがmoで記述された型から継承する場合、trueを返し、そうでない場合はfalseを返します。クラスはそれ自体から継承すると見なされます。

2.クラス関連情報を取得するためのQObjectクラスのメンバー関数は次のとおりです。

 bool Heritages(const char * className)const;
//クラスがclassNameで指定されたクラスのサブクラスである場合は、trueを返し、そうでない場合はfalseを返します。クラスはそれ自体から継承すると見なされます。

#ifndef M_H //要使用元对象系统,需在头文件中定义类。
#define M_H
#include<QObject>
class A:public QObject{ Q_OBJECT};
class B:public A{ Q_OBJECT};
class C:public QObject{Q_OBJECT};
class D:public C{};
#endif // M_H
//源文件m.cpp 的内容
#include "m.h"
#include <QMetaMethod>
#include <iostream>
using namespace std;
int main()
{ A ma; B mb; C mc; D md;
const QMetaObject *pa=ma.metaObject();
const QMetaObject *pb=mb.metaObject();
cout<<pa->className()<<endl; //输出类名A
//使用QMetaObject::inherits()函数判断继承关系。
cout<<pa->inherits(pa)<<endl; //输出1,类被认为是自身的子类
cout<<pa->inherits(pb)<<endl; //输出0,由pb 所描述的类B 不是类A 的子类。
cout<<pb->inherits(pa)<<endl; //输出1,由pa 所描述的类A 是类B 的子类。
//使用QObject::inherits()函数判断继承关系。
cout<<ma.inherits("B")<<endl; //输出0,类A 不是类B 的子类。
cout<<ma.inherits("A")<<endl; //输出1,类被认为是自身的子类
cout<<md.inherits("D")<<endl; //输出0,因为类D 未启动元对象系统。
cout<<md.inherits("C")<<endl; /*输出1,虽然类D 未启动元对象系统,但类C 已启动,此种情形下
能正确判断继承关系。*/
cout<<md.metaObject()->className()<<endl; /*输出C,此处未输出D,因为类D 未启动元对象系统,
与类D 最接近的启动了元对象系统的父类是C,因此返回C。*/
return 0; 
}

 

おすすめ

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