近来需要做一个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"));