• Qt元对象系统:QMetaMethod


    一、描述

    此类提供有关成员函数的元数据。

    二、类型成员

    1、enum QMetaMethod::Access:此枚举描述了方法的访问级别,遵循C++中使用的约定。

    • Private
    • Protected
    • Public

    2、enum QMetaMethod::MethodType:成员函数类型

    • Method:普通成员函数。
    • Signal:信号。
    • Slot:槽。
    • Constructor:构造函数。

    三、成员函数

    1、QMetaMethod::Access access()

    返回此方法的访问级别。

    2、【static】template <typename PointerToMemberFunction> QMetaMethod fromSignal(PointerToMemberFunction signal)

    返回与给定信号对应的元方法,如果信号不是类的信号,则返回无效的 QMetaMethod。

    QMetaMethod destroyedSignal = QMetaMethod::fromSignal(&QObject::destroyed);

    3、bool invoke(QObject *object, Qt::ConnectionType connectionType, QGenericReturnArgument returnValue, QGenericArgument val0 = QGenericArgument(nullptr), QGenericArgument val1 = QGenericArgument(), ......)

    对 object 对象调用此方法。如果可以调用,则返回 true。如果没有此类成员或参数不匹配,则返回false。

    调用可以是同步的,也可以是异步的,具体取决于 connectionType:

    • Qt::DirectConnection:立即调用该成员。
    • Qt::QueuedConnection:一旦应用程序进入主事件循环,就会发布一个 QEvent 并调用该成员。
    • Qt::AutoConnection:如果对象与调用者位于同一线程中,则会同步调用该成员;否则将异步调用该成员。

    此方法调用的返回值放在 returnValue 中。如果调用是异步的,则无法计算返回值。

    最多可以向这个方法调用传递十个参数(val0、val1、val2、val3、val4、val5、val6、val7、val8和val9)。

    QGenericArgument QGenericReturnArgument 是内部帮助程序类。因为可以动态调用信号和槽,所以必须使用 Q_ARG() 和 Q_RETURN_ARG() 宏将参数括起来。

    此方法不会测试参数的有效性,object 必须是构造此 QMetaMethod 的 QMetaObject 类的实例。参数的类型必须与方法预期的类型相同,否则行为未定义。

    QPushButton 上异步调用 animateClick():

    1. int methodIndex = pushButton->metaObject()->indexOfMethod("animateClick()");
    2. QMetaMethod method = metaObject->method(methodIndex);
    3. method.invoke(pushButton, Qt::QueuedConnection);

    对于异步方法调用,参数必须是Qt的元对象系统已知的类型。对于自定义类型,在调用之前需要调用 qRegisterMetaType() 注册数据类型。

    同步调用某个对象 obj 上的 QString compute(QString,int,double):

    1. QString retVal;
    2. QByteArray normalizedSignature = QMetaObject::normalizedSignature("compute(QString, int, double)");
    3. int methodIndex = obj->metaObject()->indexOfMethod(normalizedSignature);
    4. QMetaMethod method = obj->metaObject()->method(methodIndex);
    5. method.invoke(obj,
    6. Qt::DirectConnection,
    7. Q_RETURN_ARG(QString, retVal),
    8. Q_ARG(QString, "sqrt"),
    9. Q_ARG(int, 42),
    10. Q_ARG(double, 9.7));

    如果没有按指定顺序精确地接受一个QString、一个int和一个double,则调用将失败。

          bool invoke(QObject *object, QGenericReturnArgument returnValue, QGenericArgument val0 = QGenericArgument(0), QGenericArgument val1 = QGenericArgument(), ......)

    Qt::AutoConnection 调用此方法。

          bool invoke(QObject *object, Qt::ConnectionType connectionType, QGenericArgument val0 = QGenericArgument(0), QGenericArgument val1 = QGenericArgument(), ......)

    如果不关心成员的返回值,则可以使用此重载。

          bool invoke(QObject *object, QGenericArgument val0 = QGenericArgument(0), QGenericArgument val1 = QGenericArgument(), ......)

    Qt::AutoConnection 调用此方法,并忽略返回值。

    4、bool invokeOnGadget(void *gadget, QGenericReturnArgument returnValue, QGenericArgument val0 = QGenericArgument(nullptr), QGenericArgument val1 = QGenericArgument(), ......)

    在使用 Q_GADGET 的对象上调用此方法。如果可以调用成员,则返回 true。如果没有此类成员或参数不匹配,则返回 false。

    调用始终是同步的。

    此方法调用的返回值放在 returnValue 中。最多可以向这个方法调用传递十个参数(val0、val1、val2、val3、val4、val5、val6、val7、val8和val9)。

    此方法不会测试参数的有效性,gadget 必须是构造此 QMetaMethod 的 QMetaObject 类的实例。参数的类型必须与方法预期的类型相同,否则行为未定义。

    QObject

    1. class test
    2. {
    3. Q_GADGET
    4. public:
    5. test() = default;
    6. Q_INVOKABLE QString showInfo()
    7. {
    8. return "xxxxxxxxxxx";
    9. }
    10. };
    11. int main(int argc, char *argv[])
    12. {
    13. test t;
    14. QByteArray normalizedSignature = test::staticMetaObject.normalizedSignature("showInfo()");
    15. int funIndex = test::staticMetaObject.indexOfMethod(normalizedSignature);
    16. QMetaMethod method = test::staticMetaObject.method(funIndex);
    17. QString retVal;
    18. qDebug()<invokeOnGadget(&t,Q_RETURN_ARG(QString,retVal));//true
    19. qDebug()<//"xxxxxxxxxxx"
    20. }

          bool invokeOnGadget(void *gadget, QGenericArgument val0 = QGenericArgument(0), QGenericArgument val1 = QGenericArgument(), ......)

    为 gadget 调用此方法并忽略返回值。

    5、bool isConst()

    该方法是否是 const 限定的。

    6、bool isValid()

    此方法是否有效(可以内省和调用)。

    7、int methodIndex()

    返回此方法的索引。

    8、QByteArray methodSignature()

    返回此方法的签名。

    1. class test
    2. {
    3. Q_GADGET
    4. public:
    5. test() = default;
    6. Q_INVOKABLE QString showInfo(int a)
    7. {
    8. return "xxxxxxxxxxx";
    9. }
    10. };
    11. int main(int argc, char *argv[])
    12. {
    13. test t;
    14. QByteArray normalizedSignature = test::staticMetaObject.normalizedSignature("showInfo(int)");
    15. int funIndex = test::staticMetaObject.indexOfMethod(normalizedSignature);
    16. QMetaMethod method = test::staticMetaObject.method(funIndex);
    17. qDebug()<methodSignature();//"showInfo(int)"
    18. }

    9、QMetaMethod::MethodType methodType()

    返回此方法的类型(信号、槽或方法)。

    10、QByteArray name()

    返回此方法的名称。(函数名)

    11、int parameterCount()

    返回此方法的参数个数。

    12、QMetaType parameterMetaType(int index)

    返回给定索引的参数的元类型。

    13、QList parameterNames()

    返回参数名称列表。

    1. class test
    2. {
    3. Q_GADGET
    4. public:
    5. test() = default;
    6. Q_INVOKABLE QString showInfo(int a,QString b)
    7. {
    8. return "xxxxxxxxxxx";
    9. }
    10. };
    11. int main(int argc, char *argv[])
    12. {
    13. test t;
    14. QByteArray normalizedSignature = test::staticMetaObject.normalizedSignature("showInfo(int,QString)");
    15. int funIndex = test::staticMetaObject.indexOfMethod(normalizedSignature);
    16. QMetaMethod method = test::staticMetaObject.method(funIndex);
    17. qDebug()<parameterNames();//QList("a", "b")
    18. }

    14、int parameterType(int index)

    返回给定索引处的参数类型。返回值是使用 QMetaType 注册的类型,如果该类型未注册,则为 QMetaType::UnknownType

    15、QByteArray parameterTypeName(int index)

    返回位置索引处类型的名称。

    1. class test
    2. {
    3. Q_GADGET
    4. public:
    5. test() = default;
    6. Q_INVOKABLE QString showInfo(int a,QString b)
    7. {
    8. return "xxxxxxxxxxx";
    9. }
    10. };
    11. int main(int argc, char *argv[])
    12. {
    13. test t;
    14. QByteArray normalizedSignature = test::staticMetaObject.normalizedSignature("showInfo(int,QString)");
    15. int funIndex = test::staticMetaObject.indexOfMethod(normalizedSignature);
    16. QMetaMethod method = test::staticMetaObject.method(funIndex);
    17. qDebug()<parameterTypeName(1);//"QString"
    18. }

    16、QList parameterTypes()

    返回参数类型列表。

    17、QMetaType returnMetaType() 

    返回此方法的返回值类型。

    18、int returnType()

    返回此方法的返回值类型。返回值是使用 QMetaType 注册的类型,如果该类型未注册,则为QMetaType::UnknownType

    19、int revision()

    如果使用 Q_REVISION 设置了方法的修订版本,则返回方法修订版本,否则返回 0。

    20、const char * tag()

    返回与此方法关联的标签。标签是由 moc 识别的特殊宏,可以添加有关方法的额外信息。

    可以使用标签对方法进行不同的注释,并根据应用程序的特定需要对它们进行处理。

    可以通过以下方式在函数声明中添加标签信息:

    1. #ifndef Q_MOC_RUN
    2. #define MY_CUSTOM_TAG
    3. #endif
    4. class test
    5. {
    6. Q_GADGET
    7. public:
    8. test() = default;
    9. Q_INVOKABLE MY_CUSTOM_TAG QString showInfo(int a,QString b)
    10. {
    11. return "xxxxxxxxxxx";
    12. }
    13. };
    14. int main(int argc, char *argv[])
    15. {
    16. test t;
    17. QByteArray normalizedSignature = test::staticMetaObject.normalizedSignature("showInfo(int,QString)");
    18. int funIndex = test::staticMetaObject.indexOfMethod(normalizedSignature);
    19. QMetaMethod method = test::staticMetaObject.method(funIndex);
    20. qDebug()<tag();// MY_CUSTOM_TAG
    21. }

    必需使用 #ifndef Q_MOC_RUN 包围定义。

    21、const char * typeName()

    返回此方法的返回值类型名称。

    1. class test
    2. {
    3. Q_GADGET
    4. public:
    5. test() = default;
    6. Q_INVOKABLE QString showInfo(int a,QString b)
    7. {
    8. return "xxxxxxxxxxx";
    9. }
    10. };
    11. int main(int argc, char *argv[])
    12. {
    13. test t;
    14. QByteArray normalizedSignature = test::staticMetaObject.normalizedSignature("showInfo(int,QString)");
    15. int funIndex = test::staticMetaObject.indexOfMethod(normalizedSignature);
    16. QMetaMethod method = test::staticMetaObject.method(funIndex);
    17. qDebug()<typeName();// QString
    18. }

    四、宏成员

    1、Q_METAMETHOD_INVOKE_MAX_ARGS

    等于可用于通过 QMetaMethod::invoke() 执行方法的最大参数个数。

  • 相关阅读:
    【Hack The Box】Linux练习-- Luanne
    SQL Server教程 - T-SQL-编程基础
    Ubuntu安装postgresql并连接navicat
    《第一堂棒球课》:王牌一垒手·棒球3号位
    除visio以外的几款好用流程图绘制工具
    常见HTTP状态码和HTTP方法以及GET和POST区别
    C++(21):特殊工具与技术
    数字化卡券拉新怎么做?卡券营销系统如何裂变用户
    【Vue】axios的二次封装和使用(附详细代码)
    Lc第307场周赛 6166. 最大回文数字(贪心/分类讨论)
  • 原文地址:https://blog.csdn.net/kenfan1647/article/details/127424703