feat: QtMetaAboutClass
This commit is contained in:
parent
cac25277a0
commit
4fc87d12f8
20
QtMetaAboutClass/QtMetaAboutClass.pro
Normal file
20
QtMetaAboutClass/QtMetaAboutClass.pro
Normal file
@ -0,0 +1,20 @@
|
||||
QT -= gui
|
||||
|
||||
CONFIG += c++11 console
|
||||
CONFIG -= app_bundle
|
||||
|
||||
# You can make your code fail to compile if it uses deprecated APIs.
|
||||
# In order to do so, uncomment the following line.
|
||||
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
|
||||
|
||||
SOURCES += \
|
||||
main.cpp
|
||||
|
||||
# Default rules for deployment.
|
||||
qnx: target.path = /tmp/$${TARGET}/bin
|
||||
else: unix:!android: target.path = /opt/$${TARGET}/bin
|
||||
!isEmpty(target.path): INSTALLS += target
|
||||
|
||||
HEADERS += \
|
||||
m.h
|
||||
|
10
QtMetaAboutClass/m.h
Normal file
10
QtMetaAboutClass/m.h
Normal file
@ -0,0 +1,10 @@
|
||||
#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
|
47
QtMetaAboutClass/main.cpp
Normal file
47
QtMetaAboutClass/main.cpp
Normal file
@ -0,0 +1,47 @@
|
||||
#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;
|
||||
}
|
Loading…
Reference in New Issue
Block a user