이름과 관련된 클래스를 인스턴스화하려고합니다. 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
을 반환합니다.
아마도 수업을 등록하는 것을 잊어 버렸을 것입니다. 아이디어 있니?
감사
감사합니다. 잘 작동합니다! – majined