qt反射基础

最近研究了一下QT的反射机制,

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) 其中READ,WRITE是关键字

Type表示成员的类型(不支持自定义类型,对Qt很多基本类型都支持);

Member代表你给该成员另外起的名字,可以和变量名不同;get,set就是自己在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 name:TestClass------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 na+nb;
}
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 na+nb;
}
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

相关推荐
未来之窗软件服务4 分钟前
sql速度优化多条合并为一条语句
数据库
山东布谷科技官方7 分钟前
布谷直播源码部署服务器关于数据库配置的详细说明
运维·服务器·数据库·直播系统源码·直播源码·直播系统搭建·直播软件开发
易云码27 分钟前
信息安全建设方案,网络安全等保测评方案,等保技术解决方案,等保总体实施方案(Word原件)
数据库·物联网·安全·web安全·低代码
newxtc33 分钟前
【客观理性深入讨论国产中间件及数据库-科创基础软件】
数据库·中间件·国产数据库·国产中间件·科创
水月梦镜花35 分钟前
redis:list列表命令和内部编码
数据库·redis·list
7年老菜鸡39 分钟前
策略模式(C++)三分钟读懂
c++·qt·策略模式
MonkeyKing_sunyuhua1 小时前
ubuntu22.04 docker-compose安装postgresql数据库
数据库·docker·postgresql
天郁青1 小时前
数据库交互的本地项目:后台管理系统
数据库·交互
马剑威(威哥爱编程)1 小时前
MongoDB面试专题33道解析
数据库·mongodb·面试
小光学长2 小时前
基于vue框架的的流浪宠物救助系统25128(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。
数据库·vue.js·宠物