《Qt入门 (六)--使用QMetaObject创建工厂模式》

一、背景

由于需求需要,需要从配置文件里通过配置文件创建对应的类。后续查了一下,可以使用元对象来达到使用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;
}



  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值