首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用QMetaType (按名称实例化类)的反射

使用QMetaType (按名称实例化类)的反射
EN

Stack Overflow用户
提问于 2014-06-11 08:55:32
回答 1查看 736关注 0票数 0

我想实例化一个关于它的名称的类。我发现Qt允许使用QMetaType::create

我还发现,我们必须使用Q_DECLARE_METATYPE注册类。但我做了所有需要的事情(我想),但没有成功。

这是我的基础课程:

代码语言:javascript
复制
#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

这是继承的类之一:

代码语言:javascript
复制
#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

这就是我用来实例化的代码:

代码语言:javascript
复制
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);
}

我在这里给出的名称将是" Block“表示类块," CSS”表示类CSS。但是QMetaType::type总是返回QMetaType::UnknownType

也许我忘了有什么东西注册了。你有主意吗?

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-06-11 14:56:39

您还需要向qRegisterMetaType()注册该类型,以便使该名称在运行时可用。Q_DECLARE_METATYPE使编译时基于模板的Qt函数的类型为人所知。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24158614

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档