注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

沙漠里de烟雨

原创分享,禁止转载

 
 
 

日志

 
 

Qt 根据QString类型来动态创建控件  

2017-06-09 02:54:03|  分类: QT5.x与QML |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
关键代码附上:
btnfactory.h => 

#include <QWidget>

#ifndef BTNFACTORY_H
#define BTNFACTORY_H

class BtnFactory
{ //这里须注意:"#include <QWidget>" 应写在#ifndef……宏定义外;

public:
    template<typename T>
    static void registeBtnClass() //注册类型;
    {
        factory().insert(QString(T::staticMetaObject.className()),func<T>);//FuncPointer = func<T>;
    }

    static QWidget* createBtn(const QString& className, QWidget* parent=NULL)
    {
        FuncPointer ptr = factory().value(className);
        if(ptr)
            return ptr(parent);
        return NULL;
    }

private:
    typedef QWidget*(*FuncPointer)(QWidget* parent); //函数指针类型;

    template<typename T>
    static QWidget* func(QWidget* parent) //与 FuncPointer 相同的函数定义;
    {
        return new T(parent);
    }

    static QHash<QString,FuncPointer>& factory()
    {
        static QHash<QString,FuncPointer>  lst;
        return lst;
    }
};

#endif // BTNFACTORY_H

在main.cpp中注册:
    QApplication a(argc, argv);

    BtnFactory::registeBtnClass<Select>();
    BtnFactory::registeBtnClass<Paste>();
    BtnFactory::registeBtnClass<Copy>();
    BtnFactory::registeBtnClass<Cut>();
    BtnFactory::registeBtnClass<Delete>();
    BtnFactory::registeBtnClass<Shadow>();

然后在需要动态创建的地方使用:
QWidget * XPanel::getBtnByName(const QString &name)
{
    return BtnFactory::createBtn(name,this);
}

关键代码已贴出,看似有在多线程间signal与slot通信时(使用自定义类型),需要先将其注册到元系统中一样:
qRegisterMetaType<MyClass>("Myclass&")
有点反射的意思,然C++不像java一样有这样的机制。

原理其实很简单,QHash<QString,funcPtr>记录了类字符串名与相对应的函数指针的键值对,通过不同的字符串找到对应类型的
函数指针,而在函数指针指向的函数里去构建对应的类对象。这样就可以通过类型名字符串来产生对应的对象.
看效果:
Qt 根据QString类型来动态创建控件 - 漠雨 - 沙漠里de烟雨__风尘无名
 

  评论这张
 
阅读(40)| 评论(0)
推荐

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017