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