qt 内省与反射的例子


这个例子很典型,记录到这里,转载请注明来自: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;
}


结果:












评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值