Qt根據類名創建對象(元對象反射)


在java語言中,可以使用getObject(String)函數,從類名直接構建新的對象。

而在C++中是沒有這種機制的,Qt雖然提供了元對象機制,但只可以獲取對象的類名,不能反向構建。

這個問題我在百度上找了很多,但都沒有滿意的答案,索性翻出去google一下,終於找到了解決方法。

原文地址:http://www.mimec.org/node/350

 

代碼如下:

objectfactory.h
#include <QByteArray>
#include <QMetaObject>
#include <QHash>

#ifndef OBJECTFACTORY_H
#define OBJECTFACTORY_H

class ObjectFactory
{
public:
    template<typename T>
    static void registerClass()
    {
        constructors().insert( T::staticMetaObject.className(), &constructorHelper<T> );
    }

    static QObject* createObject( const QByteArray& className, QObject* parent = NULL )
    {
        Constructor constructor = constructors().value( className );
        if ( constructor == NULL )
            return NULL;
        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;
    }
};

#endif // OBJECTFACTORY_H

 

調用方法:

首先要注冊你的class:(必須繼承QObject並添加Q_OBJECT)

ObjectFactory::registerClass<MyObject>();

  

反射構建一個新對象:

MyObject* object = (MyObject*)ObjectFactory::createObject( "MyObject" );

 

作用:利用反射機制可以做很多事,例如,可以將反射與Qt的property相結合,實現hibernate框架(有空會再寫一篇博客介紹)。

不足:這種實現方法不可避免地需要“先注冊,后使用”,還達不到真正的反射,雖然可以在一個啟動函數中注冊所有的類,但還是比較麻煩的。

 

轉載請標明出處:http://www.cnblogs.com/ztzheng/p/4122975.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM