网站信息内容建设局通报,大屏可视化ui设计,汕头正规网站建设模板总部,wordpress安装在linux最近研究了一下QT的反射机制#xff0c; Qt的元对象系统除了提供信号/槽机制的特性之外#xff0c;它还提供了以下特性:
QObject::metaObject() 返回关联的元对象
QMetaObject::className() 在运行时状态下返回类名
QObject::inherits() 判断类的继承关系
QObject::tr() Qt的元对象系统除了提供信号/槽机制的特性之外它还提供了以下特性:
QObject::metaObject() 返回关联的元对象
QMetaObject::className() 在运行时状态下返回类名
QObject::inherits() 判断类的继承关系
QObject::tr()QObject::trUtf8() 提供国际化翻译字符串
QObject::setProperty()QObject::property() 通过名称来动态设置和获取属性
QMetaObject::newInstance() 创建新实例
通过QObject::metaObject()方法 所有继承于QObject的类可以 返回元对象系统为其生成的metaObject对象。QMetaObject提供的一些重要信息
QMetaClassInfo 通过宏Q_CLASSINFO的支持提供类的附加信息
QMetaEnum Qt特色的枚举对象支持key和 value之间的互转
QMetaMethod 提供类成员函数的元数据
QMetaProperty 提供类成员属性的元数据
Qt反射前期准备 1、首先得继承于Q_Object同时需要在class中加入Q_OBJECT。 2、注册类成员变量需要使用Q_PROPERTY Q_PROPERTY( type member READ get WRITE set) 其中READWRITE是关键字 Type表示成员的类型不支持自定义类型对Qt很多基本类型都支持; Member代表你给该成员另外起的名字可以和变量名不同getset就是自己在C函数里面定义的基本的访问函数名不需要写参数。
3、注册类成员函数 如果你希望这个函数能够被反射那么很简单只需要在类的函数声明前加入Q_INVOKABLE关键字。 参考文章 https://blog.csdn.net/playstudy/article/details/7861329 https://www.cnblogs.com/RainyBear/p/5251440.html
下面是我自己编写的实例 1.右击QT Creater中的项目名——添加新文件——选择C Class——Choose——取个Class nameTestClass——Base Class选择QObject——点击下一步——在项目文件列表中会增加一个testclass.h和testclass.cpp testclass.h中如下
#ifndef TESTCLASS_H #define TESTCLASS_H #include class TestClass : public QObject { Q_OBJECT public: explicit TestClass(QObject *parent 0); Q_INVOKABLE int sum(int na,int nb); Q_INVOKABLE int decrease(int na, int nb); signals: public slots: }; #endif // TESTCLASS_H
testclass.cpp中如下 #include “testclass.h” TestClass::TestClass(QObject *parent) : QObject(parent) {
}
int TestClass::sum(int na,int nb)
{return nanb;
}
int TestClass::decrease(int na, int nb)
{return na-nb;
}#include “testclass.h” TestClass::TestClass(QObject *parent) : QObject(parent) {
}
int TestClass::sum(int na,int nb)
{return nanb;
}
int TestClass::decrease(int na, int nb)
{return na-nb;
}void MainWindow::on_ShowClassInfo_clicked() { TestClass classTestClass; const QMetaObject *theMetaObject classTestClass.metaObject();//定义一个QMetaObject对象指针用来获取类classTestClass的相关信息 int nMetathodCount theMetaObject-methodCount(); for(int nMetathodIndex 0;nMetathodIndex nMetathodCount;nMetathodIndex) { QMetaMethod oneMethod theMetaObject-method(nMetathodIndex); qDebug() MethodName: oneMethod.name(); qDebug() parameterNames: oneMethod.parameterNames(); qDebug()“parameterTypes” oneMethod.parameterTypes(); qDebug() typeName: oneMethod.typeName(); qDebug() “signature: oneMethod.Signal; qDebug() “methodType: oneMethod.methodType() ”\n”; } }
程序运行后点击ShowClassInfo按钮在“应用程序输出”界面会显示如下信息
MethodName: “destroyed” parameterNames: (“”) parameterTypes (“QObject*”) typeName: void signature: 1 methodType: 1
MethodName: “destroyed” parameterNames: () parameterTypes () typeName: void signature: 1 methodType: 1
MethodName: “objectNameChanged” parameterNames: (“objectName”) parameterTypes (“QString”) typeName: void signature: 1 methodType: 1
MethodName: “deleteLater” parameterNames: () parameterTypes () typeName: void signature: 1 methodType: 2
MethodName: “_q_reregisterTimers” parameterNames: (“”) parameterTypes (“void*”) typeName: void signature: 1 methodType: 2
MethodName: “sum” parameterNames: (“na”, “nb”) parameterTypes (“int”, “int”) typeName: int signature: 1 methodType: 0
MethodName: “decrease” parameterNames: (“na”, “nb”) parameterTypes (“int”, “int”) typeName: int signature: 1 methodType: 0