QtExamples/QtMetaAboutClass/main.cpp
2021-06-22 23:29:53 +08:00

48 lines
2.2 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "m.h"
#include <QMetaMethod>
#include <iostream>
using namespace std;
//使用反射机制获取与类相关的信息
// 1、QMetaObject 类中获取与类相关的信息的成员函数有
// const char* className() const;
// 获取类的名称,注意,若某个 QObject 的子类未启动元对象系统(即未使用 Q_OBJECT
// 宏),则该函数将获取与该类最接近的启动了元对象系统的父类的名称,而不再返回
// 该类的名称,因此建议所有的 QObject 子类都使用 Q_OBJECT 宏。
// const QMetaObject* superClass() const;
// //返回父类的元对象,若没有这样的对象则返回 0。  bool inherits(const QMetaObject* mo) const; (Qt5.7)
// //若该类继承自 mo 描述的类型,则返回 true否则返回 false。类被认为继承自身。
// 2、QObject 类中获取与类相关的信息的成员函数有
// bool inherits(const char* className) const;
// //若该类是className 指定的类的子类则返回true否则返回false。类被认为继承自身。
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 已启动,此种情形下能正确判断继承关系.
//输出 C此处未输出 D因为类 D 未启动元对象系统,与类 D 最接近的启动了元对象系统的父类是 C因此返回 C。
cout<<md.metaObject()->className()<<endl;
return 0;
}