QT对象工厂设计

对象工厂

class MyFactory
{
private:
    /// className 与 QMetaObject 映射 元对象属性中的类型名称是包含命名空间的,所以注意使用规范
    static QHash<QByteArray,QMetaObject>& constructors(){
        static QHash<QByteArray,QMetaObject> hashByteArrQMetaObj;
        return hashByteArrQMetaObj;
    }
    /// TypeName 与 className 映射 若是不需要给类型增加自定义名称,这部分可以不用做
    static QHash<QString,QByteArray> &MapTypeNameWithClassName(){
        static QHash<QString,QByteArray> mapTypeNameClassName;
        return mapTypeNameClassName;
    }
public:
    static QObject * createObject(const QString & TypeName)
    {
        return  createObject(MapTypeNameWithClassName()[TypeName]);
    }
    static QObject * createObject(const QByteArray & className)
    {
        return constructors().value(className).newInstance();
    }
    static void registerClass(QMetaObject QMO ,QString TypeName){
        if(MapTypeNameWithClassName().contains(TypeName)) return;
        MapTypeNameWithClassName().insert(TypeName,QMO.className());
        if(constructors().contains(QMO.className())) return;
        constructors().insert(QMO.className(),QMO);
    }
    static QStringList getTypeNames(){
        return MapTypeNameWithClassName().keys();
    }
};

对象基类

class MyQObject:public QObject
{
    Q_OBJECT
    /// 自定义类型名称
    Q_CLASSINFO("ClassTypeName","MyQObject")
public:

};

类型注册到工厂

template<class T,class F,
         class std::enable_if<std::is_base_of<MyQObject,T>{},int>::type = 0,
         class std::enable_if<std::is_base_of<MyFactory,F>{},int>::type = 0>
class RegisteredToFactory
{
public:
    RegisteredToFactory()
    {
        auto classInfoCount = T::staticMetaObject.classInfoCount();
        QString ClassTypeName;
        for (int i=classInfoCount-1;i>=0;i++) {
            if(QString::fromStdString(T::staticMetaObject.classInfo(i).name()) == "ClassTypeName")
            {
                ClassTypeName = T::staticMetaObject.classInfo(i).value();
                break;
            }
        }
        F::registerClass(T::staticMetaObject,ClassTypeName);
    }
};

示例(待公布)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值