2014-06-11 2 views
0

이름과 관련된 클래스를 인스턴스화하려고합니다. Qt가 QMetaType::create으로 허용한다는 것을 알았습니다.
또한 우리는 Q_DECLARE_METATYPE을 사용하여 클래스를 등록해야한다는 것을 알았습니다. 그러나 나는 모든 것을 필요로했다. (나는 생각한다) 작동하지 않았다. 의QMetaType을 사용한 리플렉션 (이름으로 클래스 인스턴스화)

내 기본 클래스 : 상속 된 클래스 중 하나

#ifndef  __BLOCK_HH__ 
# define __BLOCK_HH__ 

# include <QMetaType> 
# include <QObject> 

# include <string> 
# include <vector> 

# include "Util.hpp" 
# include "Common.hh" 

class  Block 
{ 
protected: 
    std::string _name; 
    uint32  _u32StartAddr; 
    uint32  _u32EndAddr; 
    uint8  *_pu8Content; 
    bool  _bSure; 
    bool  _bVirgin; 
    std::string _type; 

    std::vector<std::string> _errorCauses; 

    Block(const std::string&, uint32, uint32, uint8 *, const std::string&); 

public: 
    Block(const std::string& = "", uint32 = 0, uint32 = 0, uint8 * = 0); 
    Block(const Block&); 
    virtual ~Block(); 

    Block& operator=(const Block&); 

    void  setName(const std::string&); 
    void  setStartAddr(uint32); 
    void  setEndAddr(uint32); 
    void  setContent(uint8 *); 
    void  sure(); 
    void  notSure(); 
    void  erase(); 

    const std::string& getName() const; 
    uint32    getStartAddr() const; 
    uint32    getEndAddr() const; 
    uint8    *getContent() const; 
    bool    isSure() const; 
    bool    isVirgin() const; 
    const std::string& getType() const; 

    void   addError(const std::string&); 
    void   dumpError(std::ostream& = std::cerr) const; 

    virtual void dump(std::ostream& = std::cout) const; 
    virtual void parse(); 

    virtual bool operator<(const Block&) const; 
}; 

Q_DECLARE_METATYPE(Block) 

#endif 

:

#ifndef  __CSS_HH__ 
# define __CSS_HH__ 

# include "Block.hh" 

typedef struct 
{ 
    uint32 boot_lma; 
    uint32 boot_vma; 
    uint32 boot_length; 
    uint32 boot_entry; 
    uint32 nb_of_param; 
} t_css; 

class  CSS : public Block 
{ 
    uint32 _u32BootFlashAddr; 
    uint32 _u32BootSdramAddr; 
    uint32 _u32BootSize; 
    uint32 _u32Bep; 
    uint32 _u32CpuClock; 
    uint32 _u32SdramSize; 
    bool _bEncram; 

public: 
    CSS(uint32 = 0, uint32 = 0, uint8 * = 0); 
    virtual ~CSS(); 

    virtual void dump(std::ostream& = std::cout) const; 
    virtual void parse(); 

    uint32 getBootFlashAddr() const; 
    uint32 getBootSdramAddr() const; 
    uint32 getBootSize() const; 
    uint32 getBEP() const; 
    uint32 getCpuClock() const; 
    uint32 getSdramSize() const; 
    bool encramEnabled() const; 
}; 

Q_DECLARE_METATYPE(CSS) 

#endif 

그리고 내가 인스턴스화하는 데 사용하는 코드의 조각이다 :

Block  *Mapper::constructBlock(const std::string& name, uint32 u32Start, uint32 u32End, uint8 *pu8Content) 
{ 
    Block *block = 0; 
    int32 i32Id = QMetaType::type(name.c_str()); 

    if (i32Id != QMetaType::UnknownType) 
    { 
     block = static_cast<Block *>(QMetaType::create(i32Id)); 
     if (block) 
     { 
      block->setStartAddr(u32Start); 
      block->setEndAddr(u32End); 
      block->setContent(pu8Content); 
      block->parse(); 
     } 
    } 
    return (block); 
} 

이름 여기에 클래스 차단을위한 "차단"과 CSS 클래스의 "CSS"가 있습니다. 그러나 QMetaType::type은 항상 QMetaType::UnknownType을 반환합니다.
아마도 수업을 등록하는 것을 잊어 버렸을 것입니다. 아이디어 있니?

감사

답변

2

은 또한 런타임에 이름을 사용할 수 있도록 qRegisterMetaType()와 유형을 등록해야합니다. Q_DECLARE_METATYPE은 템플릿을 기반으로 Qt 함수로 컴파일 할 때 알려진 형식을 만듭니다.

+0

감사합니다. 잘 작동합니다! – majined

관련 문제