QMetaObject::invokeMethod()方法应用

前言

Qt元对象系统是Qt最核心的一个基础特性,元对象系统负责信号和插槽对象间通信机制、运行时类型信息和Qt属性系统。为应用程序中使用的每个QObject子类创建一个QMetaObject实例,此实例存储QObject子类的所有元信息。通过元对象系统,你可以查询QObject的某个派生类的类名、有哪些信号、槽、属性、可调用方法等信息,然后可以使用QMetaObject::invokeMethod()调用QObject的某个注册到元对象系统中的方法。
Qt信号槽的需要一种机制,就是通过名称以类型安全的方式来间接调用那些信号,槽函数。当调用槽函数时就是通过invokeMethod()方法来实现的。除了信号,槽,只要有被Q_INVOKABLE声明的常规函数也能通过此方法调用不管该声明的方法是不是私有的。即使你在A线程中通过invokeMethod 调用方法, 被调用的方法在也不一定会在A线程中执行, 看其所在依附线程。

应用说明

[static] bool QMetaObject::invokeMethod(QObject *obj, const char *member, QGenericReturnArgument ret, QGenericArgument val0 = QGenericArgument( Q_NULLPTR ), QGenericArgument val1 = QGenericArgument(), QGenericArgument val2 = QGenericArgument(), QGenericArgument val3 = QGenericArgument(), QGenericArgument val4 = QGenericArgument(), QGenericArgument val5 = QGenericArgument(), QGenericArgument val6 = QGenericArgument(), QGenericArgument val7 = QGenericArgument(), QGenericArgument val8 = QGenericArgument(), QGenericArgument val9 = QGenericArgument())

它是一个静态方法,通过char* member形式调用对应的QObject* object对象函数(member包括信号, 槽),以及对应的返回参数,传参参数。

代码

class PLUSONE:public QObject{
    Q_OBJECT
public:
    explicit PLUSONE(QObject* parent = nullptr);
    ~PLUSONE();
private :
    Q_INVOKABLE int add(int first,  int second) ;

};

class PLUSTWO:public QObject{
    Q_OBJECT
public:
    explicit PLUSTWO(QObject* parent = nullptr);
    ~PLUSTWO();
    int add();
private :
    PLUSONE* m_pOne = nullptr;
};
PLUSONE::PLUSONE(QObject* parent)
    :QObject(parent)
{

}

PLUSONE::~PLUSONE()
{

}

int PLUSONE::add(int first,int second)
{
  return (first + second);
}

PLUSTWO::PLUSTWO(QObject* parent)
    :QObject(parent)
{

}

PLUSTWO::~PLUSTWO()
{

}

int PLUSTWO::add()
{
    m_pOne = new PLUSONE;
    int output = 0;
    int *poutput = &output;
    int first = 3, second = 4;
    int *pfirst = &first, *psecond = &second;
    
//    if(QMetaObject::invokeMethod(m_pOne, "add",
//                                  Qt::AutoConnection,
//            Q_RETURN_ARG(int, output)
//            ,Q_ARG(int, first),
//            Q_ARG(int, second)
//            ))
//    {
//        qDebug()<<"1111";
//         return output;
//    }

    if(QMetaObject::invokeMethod(m_pOne, "add",
                                  Qt::AutoConnection,
            QGenericReturnArgument("int", poutput)
            ,QGenericArgument("int", pfirst),
            QGenericArgument("int", psecond)
            ))
    {
       qDebug()<<"1112";
        return output;
    }
    return -1;
}





int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    PLUSTWO plus;
    int b = plus.add();
    qDebug()<<"b="<<b;
    return a.exec();
}

运行结果图
在这里插入图片描述

  • 3
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

道阻且长,行则降至

无聊,打赏求刺激而已

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值