Qt自定义配置文件

3 篇文章 0 订阅

  近来需要做一个qt界面的颜色配置,就是程序启动以后,自动读取一个配置的ini文件。这个界面的控件可能有标签,按钮,编辑框等等等等。并且一个控件的属性可能有很多种,比如一个按钮的背景颜色,字体颜色,有无边框等等。但是通常Qsettings都是一个key,对应一个value,这就不能实现,一个按钮设置多种属性了。那么就得自定义一个配置文件了。

 1、定义一个map容器,来初始化数据

map<QString,map<QString,QString> > m_mapControlData;//控件数据,1控件类型,2该类型数据对应的键值,3该键值对应的具体数据

这里面的三个参数分别是①控件类型,②控件具体属性,③控件具体属性的值。

比如①QPushbutton,②BackGroundColor,③颜色值。这样子我们后面只要改变②③就能实现数据的定义了。

2、那么颜色值Qcolo应该如何与Qstring互相转换呢

//颜色转字符串
QString Parameter::ColorToString(QColor color)
{
    if(color.alpha() == 0)
    {
        //透明色
        QString strTransParent = "-1";
        return strTransParent;
    }
    QRgb Rgb = qRgb(color.red(),color.green(),color.blue());
    return QString::number(Rgb,16);
}

//字符串转颜色
QColor Parameter::StringToColor(QString str)
{
    if(str == "-1")
    {
        return Qt::transparent;
    }
    QColor color(str.toUInt(NULL,16));
    return color;
}

这里"-1"的判断是我第颜色透明度的特殊处理,因为rgba,a代表是否透明,Qt::transparent就是代表穿透父类,也就是透明的意思。如果不用到就不用特殊处理。

3、map容器初始化

void Parameter::InitParam()
{
    QString strBtnBaseXD = "QPushButtonXD";
    m_mapControlData[strBtnBaseXD]["NormalColor"] = ColorToString(QColor(145,158,164));//正常背景
    m_mapControlData[strBtnBaseXD]["SelectColor"] = ColorToString(QColor(46,46,46));//选中背景
    m_mapControlData[strBtnBaseXD]["BanColor"] = ColorToString(QColor(145,158,164));//禁用背景
    m_mapControlData[strBtnBaseXD]["FontStyle"] = "Ubuntu";//字体样式
    m_mapControlData[strBtnBaseXD]["FontSize"] = "18";//字体的像素
    m_mapControlData[strBtnBaseXD]["NormalPenCOlor"] = ColorToString(Qt::black);//正常的字体颜色
    m_mapControlData[strBtnBaseXD]["SelectPenCOlor"] = ColorToString(Qt::black);//选中字体颜色
    m_mapControlData[strBtnBaseXD]["BanPenCOlor"] = ColorToString(Qt::black);//禁用字体颜色
    m_mapControlData[strBtnBaseXD]["DrawTextToImage"] = "false";//是否绘制成图片
    m_mapControlData[strBtnBaseXD]["RoundRect"] = "10";//圆角的大小

   QString strLineEditStyle = "QLineEditStyleXDMenu";
    m_mapControlData[strLineEditStyle]["EditFrameColor"] = ColorToString(QColor(0,0,0));//编辑框边框颜色
    m_mapControlData[strLineEditStyle]["EditFontColor"] = ColorToString(QColor(0,0,0));//编辑框字体颜色
    m_mapControlData[strLineEditStyle]["EditBackGroundColor"] = ColorToString(QColor(255,255,255));//编辑框背景颜色
}

QPushbuttonXD是我继承QPushbutton的一个自定义按钮类,QLineEditStyleXDMenu是一个自定义编辑框类。

4、写入配置文件

void Parameter::WriteToFile()
{
    //写入配置文件
    QString path = m_strPath;
    QSettings *settingWrite = new QSettings(path,QSettings::IniFormat);
    for(map<QString,map<QString,QString> >::iterator it1 = m_mapControlData.begin();it1 != m_mapControlData.end();it1++)
    {
        settingWrite->beginGroup(it1->first);//开始组别,一定要有个结束组别对应
        for(map<QString,QString>::iterator it2=it1->second.begin();it2!=it1->second.end();it2++)
        {
            settingWrite->setValue(it2->first,it2->second);
        }
        settingWrite->endGroup();//结束组别,一定要有个开始组别对应

    }
    delete settingWrite;//删除config配置

}

其中 m_strPath = "/skin/SkinConfig.ini",这里就是配置文件的路径。

写入后如下图:

5、读取配置文件

void Parameter::ReadFromFile()
{
    //读取配置文件
    InitParam();//一开始的初始化文件
    QString path = m_strPath;
    QSettings *SettingReader = new QSettings(path,QSettings::IniFormat);
    for(map<QString,map<QString,QString> >::iterator it1 = m_mapControlData.begin();it1 != m_mapControlData.end();it1++)
    {
        SettingReader->beginGroup(it1->first);//开始组别,一定要有个结束组别对应
        for(map<QString,QString>::iterator it2=it1->second.begin();it2!=it1->second.end();it2++)
        {
            QString strVal = SettingReader->value(it2->first,-1).toString();//该键值对应的属性值
            if(strVal == "-1")//说明该属性或者文件不存在,写入初始值
            {
                SettingReader->setValue(it2->first,it2->second);
            }
            else//该文件或者属性存在,则从本地文件里读取
            {
                m_mapControlData[it1->first][it2->first] = strVal;
            }
        }
        SettingReader->endGroup();//结束组别,一定要有个开始组别对应
    }
    delete SettingReader;//删除config配置
}

6、获取配置文件的某一个具体值

QString Parameter::GetParamValue(QString strControlType, QString strKey)
{
    QString strValue = "";
    map<QString,map<QString,QString> >::iterator iterFindControlType = m_mapControlData.find(strControlType);
    if(iterFindControlType != m_mapControlData.end())
    {
        //找到该类型的控件
        map<QString,QString>::iterator iterFind = iterFindControlType->second.find(strKey);
        if(iterFind != iterFindControlType->second.end())
        {
            //找到该类型控件的这个属性
            strValue = iterFind->second;
        }
    }
    return strValue;

}

比如,这样子在你构造的时候用一个QColor去接收,然后使用到这个颜色。

StringToColor(Parameter::GetInstance().GetParamValue("QPushButtonXD","NormalColor"));
                                                              
                                                  
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值