QT本身就带有强大的反射功能,如果想通过函数名称字符串调用函数,需要在被调用的函数前添加宏:Q_INVOKABLE
父类 QtInvoke.h 头文件:
#pragma once
#include <QMainWindow>
#include "ui_QtInvoke.h"
class QtInvoke : public QMainWindow
{
Q_OBJECT
public:
QtInvoke(QWidget *parent = nullptr);
~QtInvoke();
virtual Q_INVOKABLE void test();
virtual Q_INVOKABLE int testAdd(int a, int b);
private:
Ui::QtInvokeClass ui;
};
父类QtInvoke.cpp 文件
#include "QtInvoke.h"
#include <qdebug.h>
QtInvoke::QtInvoke(QWidget *parent)
: QMainWindow(parent)
{
ui.setupUi(this);
}
QtInvoke::~QtInvoke()
{}
Q_INVOKABLE void QtInvoke::test() {
qDebug() << " QtInvoke::test()";
}
Q_INVOKABLE int QtInvoke::testAdd(int a, int b) {
return 0;
}
子类 :QtInvokeA.h
#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);
};
子类.cpp文件:
#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;
}
main 函数:
#include <iostream>
#include <qdebug.h>
#include "QtInvokeA.h"
int main(int argc, char* argv[])
{
QApplication a(argc, argv);
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, 123), Q_ARG(int, 456));
qDebug() << retVal;
int ret = a.exec();
}
最后执行结果如下: