Qt利用反射机制实现函数调用
QT本身就带有强大的反射功能,如果想通过函数名称字符串调用函数,需要在被调用的函数前添加宏:
Q_INVOKABLE
定义一个基类:
#pragma once #include <QObject> class QtInvoke : public QObject { Q_OBJECT public: QtInvoke(QObject *parent); ~QtInvoke(); virtual Q_INVOKABLE void test(); virtual Q_INVOKABLE int testAdd(int a,int b); };
#include "QtInvoke.h" #include <QDebug> QtInvoke::QtInvoke(QObject *parent) : QObject(parent) { } QtInvoke::~QtInvoke() { } Q_INVOKABLE void QtInvoke::test() { qDebug() << " QtInvoke::test()"; } Q_INVOKABLE int QtInvoke::testAdd(int a, int b) { return 0; }
定义子类:
#pragma once #include "QtInvoke.h" class QtInvokeA :public QtInvoke { public: QtInvokeA(); ~QtInvokeA(); virtual Q_INVOKABLE void test()override; virtual Q_INVOKABLE int testAdd(int a, int b); };
#include "QtInvokeA.h" #include <QDebug> QtInvokeA::QtInvokeA():QtInvoke(nullptr){ } QtInvokeA::~QtInvokeA() { } Q_INVOKABLE void QtInvokeA::test() { qDebug() << "QtInvokeA::test()"; } Q_INVOKABLE int QtInvokeA::testAdd(int a, int b) { return a + b; }
调用:
QtInvoke* inv = new QtInvokeA; qDebug() << QMetaObject::invokeMethod(inv, "test"); int retVal = 0; qDebug() << QMetaObject::invokeMethod(inv , "testAdd" ,Q_RETURN_ARG(int, retVal) ,Q_ARG(int, 65) ,Q_ARG(int, 42)); qDebug() << retVal;
输出:
aaa