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