这个例子很典型,记录到这里,转载请注明来自:http://blog.csdn.net/ndzjx/article/details/77312559
a.h
#include <QObject>
#include <QMetaProperty>
#include <QMetaObject>
#include <QMetaMethod>
#include <iostream>
class MyClass : public QObject
{
Q_OBJECT
Q_PROPERTY(int Member1 READ Member1 WRITE setMember1 )
Q_PROPERTY(int Member2 READ Member2 WRITE setMember2 )
Q_PROPERTY(QString MEMBER3 READ Member3 WRITE setMember3 )
public:
explicit MyClass(QObject *parent = 0);
signals:
public slots:
public:
Q_INVOKABLE int Member1() { return m_member1; }
Q_INVOKABLE int Member2() { return m_member2; }
Q_INVOKABLE QString Member3() { return m_member3; }
Q_INVOKABLE void setMember1( int mem1 ) { m_member1 = mem1; }
Q_INVOKABLE void setMember2( int mem2 ) { m_member2 = mem2; }
Q_INVOKABLE void setMember3( const QString& mem3 ) { m_member3 = mem3; }
Q_INVOKABLE int func( QString flag )
{
std::cout << "hello" << std::endl;
if ("+" == flag)
{
return m_member1 + m_member2;
}
else
{
return 10;
}
}
private:
int m_member1;
int m_member2;
QString m_member3;
};
a.cpp
#include "a.h"
MyClass::MyClass(QObject *parent) :
m_member1(0),
m_member2(2),
m_member3()
{
}
main.cpp
#include <iostream>
#include "a.h"
using namespace std;
int main(int argc, char *argv[])
{
MyClass theObj;
const QMetaObject* metaObj = theObj.metaObject();
//1.遍历类的属性
int propertyCnt = metaObj->propertyCount();
for ( int i = 0; i < propertyCnt; ++ i )
{
QMetaProperty oneProperty = metaObj->property( i );
cout << " name: " << oneProperty.name();
cout << " type: " << QVariant::typeToName( oneProperty.type()) << "\n";
}
//2.遍历类的函数成员
int methodCnt = metaObj->methodCount();
for ( int idx = 0; idx < methodCnt; ++ idx )
{
QMetaMethod oneMethod = metaObj->method( idx );
cout << "--------begin-------" << "\n";
cout << " typeName: " << oneMethod.typeName() << "\n";
cout << " signature: " << oneMethod.methodSignature().data() << "\n";
cout << " methodType: " << oneMethod.methodType() << "\n";
cout << "--------end---------" << "\n";
}
//3.使用反射
cout << "-------test property-----------" << "\n";
MyClass newObj;
newObj.setProperty("Member1", 66);
cout << newObj.property( "Member1" ).toString().toStdString() << "\n";
cout << newObj.Member1() << "\n";
cout << "--------end----------" << "\n";
// 4.invokeMethod
int ret;
MyClass newObj2;
newObj2.setMember1( 20 );
newObj2.setMember2( 50 );
QMetaObject::invokeMethod( &newObj2, "func", Qt::DirectConnection,
Q_RETURN_ARG(int, ret ),
Q_ARG(QString, "+"));
cout << ret << endl;
return 0;
}
结果: