一个适用于任何继承于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”.根据需要还有一组不同的参数可以传递给构造函数。