一、背景
由于需求需要,需要从配置文件里通过配置文件创建对应的类。后续查了一下,可以使用元对象来达到使用QString 来创建类主要功能,通过QMetaObject可以只需要插入类名就可以做一个基础的映射
最后通过map来做一个for循环创建对于上百个类来说比较符合场景
实际是QMetaObject自带newInstance()来实现工厂模式的类的创建
这边需要注意的是QMetaObject 的newInstance()是需要用Q_INVOKABLE来修饰构造函数的
工厂模式无非就是在工厂里达到创建类的效果,但是如果都用if来判断,每增加一个类需要添加一段代码我是觉得比较麻烦,所以做了下优化
主要分两步:
一、插入类的map
QMap<QString, QMetaObject> metaMap;//第一个参数是类名:第二个是创建的类
metaMap.insert("Qaiststructment", Qaiststructment::staticMetaObject);
二、使用map创建类
Qflystructment* Qstructfactory ::createNewStruct(const char *typeName,QWidget *parent,QMap<QString, QMetaObject> map)
{
Qflystructment* tmpClass = nullptr;
tmpClass = static_cast<Qflystructment *>(map.value(typeName).newInstance());
tmpClass->setParent(parent);
return tmpClass;
}
现在附下代码
工厂类的structfactory.h代码如下
#ifndef STRUCTFACTORY_H
#define STRUCTFACTORY_H
#include "airspeedtstructment.h"
#include "aiststructment.h"
#include "altstructment.h"
#include "clockstructment.h"
#include "egtffstructment.h"
#include "headstructment.h"
#include "oilstructment.h"
#include "qtystructment.h"
#include "rmistructment.h"
#include "rpmstructment.h"
#include "turnstructment.h"
#include "vacampstructment.h"
#include "verspeedstructment.h"
#include "fuelstructment.h"
#include "vor1structment.h"
#include "vor2structment.h"
class Qstructfactory:public QObject
{
public:
Qstructfactory(QWidget *parent);
~Qstructfactory();
void readSettings();
void writeSettings();
static Qflystructment* createNewStruct(const char *typeName,QWidget *parent,QMap<QString, QMetaObject> map);
QList<Qflystructment *> GetStructList(void);
public:
QList<Qflystructment *> m_StructList;
QMap<QString, QMetaObject> metaMap;
QStringList Classnamelist;
#endif // STRUCTFACTORY_H
工厂类的structfactory.cpp代码如下
#include "structfactory.h"
Qstructfactory::Qstructfactory(QWidget *parent):QObject(parent)
{
metaMap.insert("Qairspeedstructment", Qairspeedstructment ::staticMetaObject);
metaMap.insert("Qaiststructment", Qaiststructment ::staticMetaObject);
metaMap.insert("Qaltstructment", Qaltstructment ::staticMetaObject);
metaMap.insert("Qclockstructment", Qclockstructment ::staticMetaObject);
metaMap.insert("Qegtffstructment", Qegtffstructment ::staticMetaObject);
metaMap.insert("Qheadstructment", Qheadstructment ::staticMetaObject);
metaMap.insert("Qoilstructment", Qoilstructment ::staticMetaObject);
metaMap.insert("Qqtystructment", Qqtystructment ::staticMetaObject);
metaMap.insert("Qrmistructment", Qrmistructment ::staticMetaObject);
metaMap.insert("Qrpmstructment", Qrpmstructment ::staticMetaObject);
metaMap.insert("Qturnstructment", Qturnstructment ::staticMetaObject);
metaMap.insert("Qvacampstructment", Qvacampstructment ::staticMetaObject);
metaMap.insert("Qverspeedstructment", Qverspeedstructment::staticMetaObject);
metaMap.insert("Qfuelstructment", Qfuelstructment::staticMetaObject);
metaMap.insert("Qvor1structment", Qvor1structment::staticMetaObject);
metaMap.insert("Qvor2structment", Qvor2structment::staticMetaObject);
readSettings();
for(int i=0; i<Classnamelist.count(); i++){
char* ch;
QByteArray ba = Classnamelist.at(i).toLatin1(); // must
ch = ba.data();
//qDebug()<<"name:"<<Classnamelist.at(i);
m_StructList <<createNewStruct(ch,parent,metaMap);
}
}
/*******************************************************************
** 函数名: Qstructfactory
** 函数描述: 析构函数
** 参数:
** 返回:
********************************************************************/
Qstructfactory::~Qstructfactory()
{
// writeSettings();
for(int i=0; i<m_StructList.count(); i++){
delete m_StructList.at(i);
}
}
/*******************************************************************
** 函数名: readSettings
** 函数描述: 窗口配置文件读取
** 参数:
** 返回:
********************************************************************/
void Qstructfactory::readSettings()
{
QString fileName;
QObject *obj = this;
fileName = QCoreApplication::applicationDirPath();
fileName+="/config/";
fileName+=obj->metaObject()->className();
fileName+=".ini";
QSettings settings(fileName,QSettings::IniFormat);
QVariant variant = settings.value(QString("config/struct"));
Classnamelist = variant.value<QStringList>();
}
/*******************************************************************
** 函数名: writeSettings
** 函数描述: 窗口配置文件写入
** 参数:
** 返回:
********************************************************************/
void Qstructfactory::writeSettings()
{
QString fileName;
QObject *obj = this;
fileName = QCoreApplication::applicationDirPath();
fileName+="/config/";
fileName+=obj->metaObject()->className();
fileName+=".ini";
QSettings settings(fileName,QSettings::IniFormat);
QVariant variant;
variant.setValue(Classnamelist);
//将信息写入配置文件
settings.beginGroup("config");
settings.setValue("struct", variant);
settings.endGroup();
}
Qflystructment* Qstructfactory ::createNewStruct(const char *typeName,QWidget *parent,QMap<QString, QMetaObject> map)
{
//Q_UNUSED(parent)
Qflystructment* tmpClass = nullptr;
tmpClass = static_cast<Qflystructment *>(map.value(typeName).newInstance());
tmpClass->setParent(parent);
return tmpClass;
}
QList<Qflystructment *> Qstructfactory ::GetStructList(void)
{
return m_StructList;
}