对象工厂
class MyFactory
{
private:
static QHash<QByteArray,QMetaObject>& constructors(){
static QHash<QByteArray,QMetaObject> hashByteArrQMetaObj;
return hashByteArrQMetaObj;
}
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);
}
};
示例(待公布)