• 一个适用于任何继承于QObject的类的创建工厂


     1 class ObjectFactory
     2 {
     3 public:
     4     template<typename T>
     5     static void registerClass()
     6     {
     7         constructors().insert( T::staticMetaObject.className(), &constructorHelper<T> );
     8     }
     9  
    10     static QObject* createObject( const QByteArray& className, QObject* parent = NULL )
    11     {
    12         Constructor constructor = constructors().value( className );
    13         if ( constructor == NULL )
    14             return NULL;
    15         return (*constructor)( parent );
    16     }
    17  
    18 private:
    19     typedef QObject* (*Constructor)( QObject* parent );
    20  
    21     template<typename T>
    22     static QObject* constructorHelper( QObject* parent )
    23     {
    24         return new T( parent );
    25     }
    26  
    27     static QHash<QByteArray, Constructor>& constructors()
    28     {
    29         static QHash<QByteArray, Constructor> instance;
    30         return instance;
    31     }
    32 }; 

    使用这种途径,不在需要使用Q_INVOKABLE声明构造器了,而且如果没有找到合适的构造器,只要这个类注册了,在constructorHelper()方法中就会报告一个编译错误。而且代码很容易使用:

    1 ObjectFactory::registerClass<Foo>();
    2  
    3 // ...
    4  
    5 QObject* foo = ObjectFactory::createObject( "Foo" );

     同时也很容易修改这个代码,来适用于那些不从QObject继承的自定义抽象类,例如它可以使用任何传递给registerClass()方法或者自动从类的静态成员接收的类型的“Key”,而不是使用从OMetaObject接收的类名作为“Key”.根据需要还有一组不同的参数可以传递给构造函数。

  • 相关阅读:
    Beta版使用说明
    【每日scrum】NO.7
    【每日scrum】NO.6
    【每日scrum】NO.5
    【每日scrum】NO.4
    【每日scrum】NO.3
    【每日scrum】NO.2
    【每日scrum】NO.1
    运行及总结
    测试与调试
  • 原文地址:https://www.cnblogs.com/eliu/p/9790654.html
Copyright © 2020-2023  润新知