天天看點

Qt 的反射(Reflection)應用 第一種方式: 第二種方式:

反射, 在我看來 就是 運作時把字元串映射為類.

我不是很專業, 還望各位大佬嘴下留情.....

參考  https://blog.csdn.net/kenier/article/details/62041312
      https://blog.csdn.net/liulong1567/article/details/45273017
           

 第一種方式:

//
class TestReflection : public QObject
{
    Q_OBJECT
public:
    //此處必須使用 Q_INVOKABLE 
    Q_INVOKABLE explicit TestReflection(QObject *parent = nullptr):QObject(parent)
    {
        m_name.clear();
    }
    Q_INVOKABLE QString name() const 
    {
        return m_name;
    }
private:
    QString m_name;
};

    //調用
    qRegisterMetaType<TestReflection*>();
    int type = QMetaType::type("TestReflection*");

    const QMetaObject *metaObj = QMetaType::metaObjectForType(type);
    QObject *obj = metaObj->newInstance(Q_ARG(QString, QStringLiteral("Reflection")),
                                        Q_ARG(QObject*, nullptr));
    TestReflection *test = qobject_cast<TestReflection*>(obj);
    QString retVal;
    QMetaObject::invokeMethod(test, "name", Qt::DirectConnection,
                              Q_RETURN_ARG(QString, retVal));
    qDebug() << "result: " << retVal;
           

 第二種方式:

//
#include <QObject>
#include <QtDebug>
#include <QByteArray>
#include <QMetaObject>
#include <QHash>
class A : public QObject
{
    Q_OBJECT
public:
    A(QObject *p) : QObject(p)
    {
        qDebug() << Q_FUNC_INFO;
    }
    Q_INVOKABLE void name()
    {
        qDebug() << Q_FUNC_INFO;
    }
};

//
class ObjectFactory
{
public:
    template<typename T> static void registerClass()
    {
        qDebug() << "class name: [" << typeid(T).name() << "]";
        constructors().insert( T::staticMetaObject.className(), &constructorHelper<T> );
    }

    static QObject* createObject( const QByteArray& className, 
                                  QObject* parent = nullptr )
    {
        Constructor constructor = constructors().value( className );
        if ( constructor == nullptr )
            return nullptr;
        return (*constructor)( parent );
    }

private:
    typedef QObject* (*Constructor)( QObject* parent );

    template<typename T> static QObject* constructorHelper( QObject* parent )
    {
        return new T( parent );
    }

    static QHash<QByteArray, Constructor>& constructors()
    {
        static QHash<QByteArray, Constructor> instance;
        return instance;
    }
};

//調用
    ObjectFactory::registerClass<A>();
    A* object = (A*)ObjectFactory::createObject( "A" );
    if(object)
    {
        QMetaObject::invokeMethod(object, "name", Qt::DirectConnection);
    }
           

繼續閱讀