Use el mecanismo de reflexión de Qt para obtener la información relevante de la clase escrita (el número de funciones miembro de la clase, tipo, nombre, etc., con código de ejemplo)

Recientemente estudié el mecanismo de reflexión de
Qt. Además de las características del mecanismo de señal/ranura proporcionado por el sistema de metaobjetos de Qt, también proporciona las siguientes características:

QObject::metaObject()
devuelve el metaobjeto asociado

QMetaObject::className()
devuelve el nombre de la clase en estado de tiempo de ejecución

QObject::inherits()
determina la relación de herencia de una clase

QObject::tr(), QObject::trUtf8()
proporcionan internacionalización, cadenas de traducción

QObject::setProperty(), QObject::property()
para establecer dinámicamente y obtener propiedades por nombre

QMetaObject::newInstance()
crea una nueva instancia

A través del método QObject::metaObject(), todas las clases que heredan de QObject pueden devolver el objeto metaObject generado para ellas por el sistema de metaobjetos. Alguna información importante proporcionada por QMetaObject:

QMetaClassInfo
proporciona información adicional sobre la clase a través del soporte de la macro Q_CLASSINFO

QMetaEnum
Objeto de enumeración característico de Qt, que admite la conversión mutua entre clave y valor

QMetaMethod
proporciona metadatos para funciones de miembros de clase

QMetaProperty
proporciona metadatos para las propiedades de los miembros de la clase

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关键字。
参考文章:
blog.csdn.net/playstudy/a…
www.cnblogs.com/RainyBear/p…

下面是我自己编写的实例:
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 <QObject>
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;
    }
复制代码

在主界面的cpp中添加一个按钮响应函数,如下:
注:在主界面.cpp中要包含TestClass的头文件#include “testClass.h”

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 
复制代码

可以看到,TestClass实例化的类变量classTestClass的QMetaObject遍历出来的QMetaMethod一共有7个,其中除了我们手动添加的int sum(int na,int nb);和int decrease(int na, int nb);之外,还有5个自动生成的隐藏的QMetaMethod。

Supongo que te gusta

Origin juejin.im/post/7022845686752378916
Recomendado
Clasificación