QMetaObject调用对象函数

使用QMetaObject的invokeMethod调用对象函数,可以通过预设的值来实现,对象函数的自动调用。比如说我需要给对象的姓名,性别,年龄复制。那么我只需要传入三个值就行了。就能实现函数的自动调用,
1.定义一个people类
.h文件

#include <QObject>
#include<QVariant>
class People : public QObject
{
    Q_OBJECT
public:
    explicit People(QObject *parent = 0);

    QString m_name;
    //定义一个属性 name
    //读取属性name的时候 会调用getName函数
    //给属性name复制的时候 会调用setName函数
    //在这里属性name的值其实就是全局变量m_name的值
    Q_PROPERTY(QString name READ getName WRITE setName )
    //Q_INVOKABLE  表示改函数可以使用QMetaObject::invokeMethod来调用
    Q_INVOKABLE void setName(const QVariant name);
    Q_INVOKABLE QString getName();

    QString m_sex;
    Q_PROPERTY(QString sex READ getSex WRITE setSex )
    Q_INVOKABLE void setSex(const QVariant sex);
    Q_INVOKABLE QString getSex();

    int m_age;
    Q_PROPERTY(int age READ getAge WRITE setAge )
    Q_INVOKABLE void setAge(const QVariant age);
    Q_INVOKABLE int getAge();

signals:

public slots:

private:

};

.cpp文件

#include "people.h"

People::People(QObject *parent) : QObject(parent)
{

}

void People::setName(const QVariant name)
{
    m_name =name.toString();
}

void People::setSex(const QVariant sex)
{
    m_sex =sex.toString();
}

void People::setAge(const QVariant age)
{
    m_age =age.toInt();
}

QString People::getName()
{
    return m_name;
}

QString People::getSex()
{
    return m_sex;
}

int People::getAge()
{
    return m_age;
}

函数调用

#include "widget.h"
#include "ui_widget.h"
#include"people.h"
#include <QMetaObject>
#include<QMetaMethod>
#include<QDebug>
Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
}

Widget::~Widget()
{
    delete ui;
}

void Widget::on_pushButton_clicked()
{
    People p ;

    for(int i=0; i< p.metaObject()->methodCount();i++)
    {
    //这里会遍历出People类的所有成员函数,然后根据需要调用需要的函数
        QString methName = p.metaObject()->method(i).name();
        if(methName.contains("set"))
        {
            if(methName.contains("Name"))
            {
            //参数1 调用对象
            //参数2 对象的函数名
            //参数3:调用方式
            //参数四 函数的实参
                QMetaObject::invokeMethod(&p, methName.toStdString().c_str(), Qt::DirectConnection, Q_ARG(QVariant, "张三"));
            }
            else if(methName.contains("Age")) {
                QMetaObject::invokeMethod(&p, methName.toStdString().c_str(), Qt::DirectConnection, Q_ARG(QVariant, 19));
            }
            else if(methName.contains("Sex")){
                QMetaObject::invokeMethod(&p, methName.toStdString().c_str(), Qt::DirectConnection, Q_ARG(QVariant, "男"));
            }

        }

    }

	//通过属性名获取值
    ui->lineEdit->setText(p.property("name").toString());
    ui->lineEdit_2->setText(p.property("sex").toString());
    //通过对象的函数获取值
    ui->lineEdit_3->setText(QString::number(p.getAge()));


}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值