Qt利用反射机制实现函数调用

时间:2024-03-24 18:02:31

        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();
}

最后执行结果如下: