Qt读写INI配置文件
void WriteSettings()
{
//QSettings settings("Software Inc", "Spreadsheet"); // windows在注册表中建立建 Software Inc -> Spreadsheet
QSettings settings("Option.ini", QSettings::IniFormat); // 当前目录的INI文件
settings.beginGroup("DevOption");
settings.setValue("mainFun", 25);
settings.setValue("subFun", 40);
settings.setValue("service", 1);
settings.endGroup();
}
void ReadSettings()
{
QSettings settings("Option.ini", QSettings::IniFormat);
int mainFun = settings.value("DevOption/mainFun").toInt();
int subFun = settings.value("DevOption/subFun").toInt();
QString service = settings.value("DevOption/service").toString();
qDebug() << "service" << service;
qDebug() << "mainFun" << mainFun;
qDebug() << "subFun" << subFun;
}
int main(int argc,char *argv[])
{
QCoreApplication a(argc, argv);
WriteSettings();
ReadSettings();
return a.exec();
}
Qt读写XML文件
一、首先咱们得认识处理XML的方法有那些,QT提供了那些函数用于处理。
我们知道对XML的操作有两种方法,即DOM方式和SAX方式。二者主要区别是:DOM实现方式操作非常简单,但不适合处理过大文件;而SAX实现方式是能处理很大的XML文件,但是需要开发者写一些复杂的代码。Qt提供了对应于这两种用于读取、操作和编写XML的实现类,分别是QDomDocument类和QXmlStreamReader类,由于在项目中涉及的文件不大,因此我们选用QDomDocument类来
处理。
二、咱们需要了解XML文件的最常见格式:
1、需要知道一个XML文件有且只有一个根节点;
2、子节点与元素的概念,以及它们之间的联系(如何包含);
三、对XML文件创建,读取、修改:
1. 创建节点,将其写入XML文件,主要操作包括:
QDomDocument doc;
1).创建根节点:QDomElement root = doc.createElement("root")
2).创建元素节点:QDomElement element = doc.createElement("nodeName");
3).添加元素节点到根节点:root. appendChild(element);
4).创建元素文本:QDomText nodeText=doc.createTextNode("text");
5).添加元素文本到元素节点:element. appendChild(nodeText);
在本项目中,假设便签的属性有序号、名字、内容、字体、字号、颜色、粗细、斜体、下划线这几项,则在文件中添加一个便签节点的操作如下:
QDomDocument doc;
instruction = doc.createProcessingInstruction("xml","version="1.0" encoding="UTF-8"");
doc.appendChild(instruction);
QDomElement root = doc.createElement_x_x("Notes");
doc.appendChild(root);
QDomElement note = doc.createElement_x_x("note");
root.appendChild(note);
QDomElement no = doc.createElement_x_x("no");
note.appendChild(no);
...
...
QDomText no_text = doc.createTextNode("001");
...
...
则得到一个便签节点,将其保存到test.xml文件中,代码如下:
QFile file("test.xml");
if (!file.open(QIODevice::WriteOnly | QIODevice::Truncate |QIODevice::Text))
return ;
QTextStream out(&file);
out.setCodec("UTF-8");
doc.save(out,4,QDomNode::EncodingFromTextStream);
file.close();
则test.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<Notes>
<note>
<no>001</no>
<name>2010-05-10(13:53:24)</name>
<content>A meeting!</content>
<font>Script MT Bold</font>
<fontSize>16</fontSize>
<color> #00ffff</color>
<weight>0</weight>
<fontItalic>true</fontItalic>
<fontUnderline>true</fontUnderline>
</note>
</Notes>
上面是创建一个便签节点,若要继续添加便签节点,则需要在已有节点后增加一个新节点,并重写入XML文件。
2. 加载、查找便签时要读取XML文档中的节点信息,DOM实现方式是将整个文档当作一个对象来装入内存进行处理,然后开发者可以访问这个对象中的每一个节点,每一个节点对应XML文件里的一个标记。
主要操作包括:
1).读取根节点:QDomElement root = doc.documentElement();
2).读取第一个子节点:QDomNode node = root.firstChild();
3).读取下一个子节点:node = node.nextSibling();
4).匹配结点标记:node.toElement().tagName() == "note"
5).读取节点文本:no = childNode.toText().data();
//========================遍历节点================
可以通过doc.childNodes()获得doc的所有的子节点列表QDomNodeList。比如
QDomNodeList list=doc.childNodes();
for(int i=0;i<list.count();i++){
QDomNode node=list.at(i);//好的风格当然是把定义写在外面:(
//qDebug()<<”node name is “<<node.nodeName();
//qDebug()<<”node type is “<<.nodeType();
}
//==============================================
以下是项目中读取便签属性的函数实现代码:
void MainWindow::parseAttr(const QDomElement &element)
{
QString no,name,content,font,fontSize,color;
QDomNode node = element.firstChild();
while (!node.isNull()) {
if (node.toElement().tagName() == "note") {//匹配note节点
parseAttr(node.toElement());
} else if (node.toElement().tagName() == "no") {//匹配属性no
QDomNode childNode = node.firstChild();
if (childNode.nodeType() == QDomNode::TextNode) {
no = childNode.toText().data();
}
}
else if (node.toElement().tagName() == "name") //匹配属性name
...
...
node = node.nextSibling();//读取兄弟节点
}
}
3. 删除便签时,要删除相应的XML节点,用到的主要函数为:root.removeChild(node); 但在删除某个节点后要重写整个文件。
以上对XML文件的重写操作是必须的,因此在文件的打开方式中要加上QIODevice::Truncate,表示覆盖重写。目前还没有找到可以直接修改文件的方法,但若文件很大的情况下,必须考虑相
应的效率问题。
4.读取XML文件内容:
//===================打开document===============add me ======
QString xmlPath = "filename.xml";
QFile file(xmlPath);
if (!file.open(QFile::ReadOnly | QFile::Text))
return ;
QString errorStr;
int errorLine;
int errorColumn;
QDomDocument doc;
if (!doc.setContent(&file, false, &errorStr, &errorLine, &errorColumn))
return ;
file.close();
//也可以用doc.setContent(&file)带一个参数就行。
//=============================================================
然后按照上面方式遍历数据,修改后在以上面相同的方式写入到XML文件中。
//=========================================附加一段代码创建XML文件===============
#include <QApplication>
#include <QFile>
#include <QDomDocument>
#include <QTextStream>
#include <QTextCodec>
#include <QMessageBox>
int main (int argc,char **argv)
{
QApplication a (argc,argv);
QFile file("InitInfo.xml");
if(!file.open(QFile::ReadOnly | QFile::Text))
{
// QMessageBox::information(this,tr("error"),tr("无法打开XML文件"));
return 1;
}
/*第一步,将file中的内容读入doc内存中*/
QDomDocument doc;
doc.setContent(&file,false,&errorStr,&errorLine,&errorColumn);
file.close();
/*第二步,创建根节点*/
QDomElement root = doc.createElement("root"); //创建根节点
/*第三步:创建子节点和元素,并将元素加入相应节点内,最后将节点加入根节点中*/
QDomElement element = doc.createElement("device3"); //创建第一个子节点
element.setAttribute("ChildName","Content");
QDomElement el_address = doc.createElement("Content"); //创建一个元素 该元素有三种属性
el_address.setAttribute("key","equipmentname");
el_address.setAttribute("value","CSC101B");
el_address.setAttribute("name","itemName");
element.appendChild(el_address); //将该元素增加到第一节点中.
QDomElement el_path = doc.createElement("path"); //创建第二个元素,
QDomText text_path = doc.createTextNode("aaa"); //创建该元素的文本
el_path.appendChild(text_path); //将该元素文本增加到该元素中
element.appendChild(el_path); //将该元素添加到第一个子节点中
root.appendChild(element); //将该子节点加入到根节点下.
QFile f("InitInfo.xml");
if(!f.open(QFile::WriteOnly | QFile::Text))
return 1;
QTextStream out(&f);
QTextCodec * codec = QTextCodec::codecForName("gbk"); //此处是设置文件支持的编码格式
out.setCodec(codec);
QString strHead("version =1.0 encoding =GB2312" );
doc.appendChild(doc.createProcessingInstruction("xml" ,strHead ));
out << doc.toString();
root.save(out,2);
f.close();
return 0;
}
其它内容:
1 首先对XML文件进行操作,打开文件。
这个其实就是对文件进行操作,可以把它直接定义为构造函数,在对对象进行初始化时完成。
TopoDataReader::TopoDataReader(const wstring &filePath):_filePath(filePath),_qDomDoc("mydocument"),_qFile(QString::fromStdWString(filePath))
{
if (!_qFile.open(QIODevice::ReadOnly))
{
return;
}
if (!_qDomDoc.setContent(&_qFile))
{
_qFile.close();
return;
}
}
2 读取XML文件中的节点内容
假设XML文件格式如下
(1)
<switchs>
<switch snmpip=211.87.235.136 newwork=front>
</switch>
</switchs>
(2)
<ip>211.87.235.136</ip>
对于第一种情况,采用如下方法:
QDomElement docElem = _qDomDoc.documentElement();
QDomNode nodeswitch=docElem.elementsByTagName("switch ");//红色的为标签名
QDomElement elemnodeswitch=nodeswitch.toElement();
string snmpip=qPrintable(elemnodeswitch.attribute("snmpip"));//network的也是如此方法获取
对于第二种情况,采用如下方法:
直接调用text() API就可以了
string ip=qPrintable(elementnodeip.text());
但是,假设文件中有多个同样的节点,如下
<a>
<b></b>
<b></b>
</a>
这样用elementsByTagName("b")返回的就是一个childNodes()而不是一个单独的node了。
我们可以使用at()方法具体定位。
另外,我们还可以使用这样一种方法获取节点的值,假设XML文件如下
- +<switch snmpIp="192.168.120.251" network="front">
<name>前端主交换机</name>
<description />
- <ipList>
<ip>192.168.120.251</ip>
</ipList>
<rwCommunity>public@120</rwCommunity>
<workMode>true</workMode>
<workStatus>true</workStatus>
<enableAlarm>true</enableAlarm>
<snmpCount>0</snmpCount>
<memoryUtilizationRatio>50.0</memoryUtilizationRatio>
<cpuUtilizationRatio>50.0</cpuUtilizationRatio>
<port>161</port>
<snmpStatus>true</snmpStatus>
<privateName>CZ-5_FA</privateName>
<switchIndex>topLeft</switchIndex>
</switch>
我们可以先获取switch节点,然后得到其childNodes(),于是就可以使用at()方法来获取下面的每个节点了(注:从0开始)
比如说,上面的那个ip节点就是nodeswitch.childNodes().at(3)。
这样做得好处就是不用担心重复的问题,只要你确定switch节点确定对了,底下的也就一定能确定了。
3 返回某个节点下子节点的个数
这个简单,也是直接调API
QDomElement docElem = _qDomDoc.documentElement();
QDomNode nodetagname=docElem.elementsByTagName(tagname).at(0);//假设有多个tagname此处选第一个
int num=nodetagname.childNodes().size();
Qt读写XML文件例子
bool UIPublicOperate::readSettings(QHash<QString,QString> &content,QString filename)
{
if(filename.isEmpty())
return false;
QFile file(filename);
if(!file.open(QFile::ReadOnly|QFile::Text))
{
return false;
}
QDomDocument document;
QString error;
int row = 0,column = 0;
if(!document.setContent(&file,false,&error,&row,&column))
{
return false;
}
if(document.isNull())
{
return false;
}
QDomElement root = document.documentElement();
QDomNodeList list = root.childNodes();
int count = list.count();
for(int i = 0; i<count;i++)
{
QDomNode dom_node = list.item(i);
QDomElement element = dom_node.toElement();
QString element_name = element.tagName();
QString element_text = element.text();
content.insert(element_name,element_text);
}
return true;
}
bool UIPublicOperate::writeSettings(QHash<QString,QString> content,QString filename)
{
QDomDocument doc;
QDomProcessingInstruction instruction;
instruction = doc.createProcessingInstruction("xml","version=\"1.0\" encoding=\"UTF-8\"");
doc.appendChild(instruction);
QDomElement root = doc.createElement(filename.remove(".xml"));
doc.appendChild(root);
QHash<QString,QString>::iterator mi;
for(mi = content.begin();mi!=content.end();mi++)
{
QDomElement nodecontent = doc.createElement(mi.key());
QDomText textcontent = doc.createTextNode(mi.value());
nodecontent.appendChild(textcontent);
root.appendChild(nodecontent);
}
QFile file("settings.xml");
if(!file.open(QIODevice::WriteOnly|QIODevice::Truncate|QIODevice::Text))
return false;
QTextStream out(&file);
out.setCodec("UTF-8");
doc.save(out,4,QDomNode::EncodingFromTextStream);
file.close();
return true;
}
Qt读写Json串
- JsonCpp
- cJSON
- QJson
- QJsonDocument
- QJsonObject
- QJsonArray
QJsonObject json;
json.insert("name", QString("Qt"));
json.insert("version", 5);
json.insert("windows", true);
QJsonDocument document;
document.setObject(json);
QByteArray byte_array = document.toJson(QJsonDocument::Compact);
QString json_str(byte_array);
QJsonParseError json_error;
QJsonDocument parse_doucment = QJsonDocument::fromJson(byte_array, &json_error);
if(json_error.error == QJsonParseError::NoError)
{
if(parse_doucment.isObject())
{
QJsonObject obj = parse_doucment.object();
if(obj.contains("name"))
{
QJsonValue name_value = obj.take("name");
if(name_value.isString())
{
QString name = name_value.toString();
}
}
if(obj.contains("version"))
{
QJsonValue version_value = obj.take("version");
if(version_value.isDouble())
{
int version = version_value.toVariant().toInt();
}
}
if(obj.contains("windows"))
{
QJsonValue version_value = obj.take("windows");
if(version_value.isBool())
{
bool flag = version_value.toBool();
}
}
}
}
QJsonArray json;
json.insert(0, QString("Qt"));
json.insert(1, QString("version"));
json.insert(2, true);
QJsonDocument document;
document.setArray(json);
QByteArray byte_array = document.toJson(QJsonDocument::Compact);
QString json_str(byte_array);
QJsonParseError json_error;
QJsonDocument parse_doucment = QJsonDocument::fromJson(byte_array, &json_error);
if(json_error.error == QJsonParseError::NoError)
{
if(parse_doucment.isArray())
{
QJsonArray array = parse_doucment.array();
int size = array.size();
for(int i=0; i
{
QJsonValue value = array.at(i);
if(value.isString())
{
QString name = value.toString();
}
else if(value.isBool())
{
bool flag = value.toBool();
}
}
}
}
例子:
//解包
bool jsonpack(QString & data,QByteArray byte_array);
bool jsonpack(QString &data);
bool jsonpack(QByteArray &data,HBookingInfoVeryDay &bookinginfo,int type);
//组包
bool jsonparse(QByteArray &byte_array);
bool jsonparse(QString & data,QByteArray &byte_array);
bool jsonparse(QByteArray &data,HBookingInfoVeryDay &bookinginfo,int type);
bool PublicOperate::writeSettings(QHash<QString,QString> content,QString filename)
{
QDomDocument doc;
QDomProcessingInstruction instruction;
instruction = doc.createProcessingInstruction("xml","version=\"1.0\" encoding=\"UTF-8\"");
doc.appendChild(instruction);
QDomElement root = doc.createElement(filename.remove(".xml"));
doc.appendChild(root);
QHash<QString,QString>::iterator mi;
for(mi = content.begin();mi!=content.end();mi++)
{
QDomElement nodecontent = doc.createElement(mi.key());
QDomText textcontent = doc.createTextNode(mi.value());
nodecontent.appendChild(textcontent);
root.appendChild(nodecontent);
}
/*
QDomElement nodeMCU = doc.createElement("MCU");
QDomElement nodeService = doc.createElement("Service");
QDomElement nodeClient = doc.createElement("Client");
QDomElement nodeMaster = doc.createElement("Master");
QDomElement nodeLocal = doc.createElement("Local");
root.appendChild(nodeMCU);
root.appendChild(nodeService);
root.appendChild(nodeClient);
root.appendChild(nodeMaster);
root.appendChild(nodeLocal);
QDomText textMCU = doc.createTextNode("MCU");
QDomText textService = doc.createTextNode("Service");
QDomText textClient = doc.createTextNode("Client");
QDomText textMaster = doc.createTextNode("Master");
QDomText textLocal = doc.createTextNode("Local");
nodeMCU.appendChild(textMCU);
nodeService.appendChild(textService);
nodeClient.appendChild(textClient);
nodeMaster.appendChild(textMaster);
nodeLocal.appendChild(textLocal);*/
QFile file("settings.xml");
if(!file.open(QIODevice::WriteOnly|QIODevice::Truncate|QIODevice::Text))
return false;
QTextStream out(&file);
out.setCodec("UTF-8");
doc.save(out,4,QDomNode::EncodingFromTextStream);
file.close();
return true;
}
bool PublicOperate::jsonpack(QString & data,QByteArray byte_array)
{
QString name;
int version;
bool flag;
QJsonParseError json_error;
QJsonDocument pars_document = QJsonDocument::fromJson(byte_array,&json_error);
if(json_error.error == QJsonParseError::NoError)
{
if(pars_document.isObject())
{
QJsonObject obj = pars_document.object();
if(obj.contains("name"))
{
QJsonValue name_value = obj.take("name");
if(name_value.isString())
{
name = name_value.toString();
}
}
if(obj.contains("version"))
{
QJsonValue version_value = obj.take("version");
if(version_value.isDouble())
{
version = version_value.toVariant().toInt();
}
}
if(obj.contains("windows"))
{
QJsonValue version_value = obj.take("windows");
if(version_value.isBool())
{
flag = version_value.toBool();
}
}
}
}
return true;
}
bool PublicOperate::jsonpack(QString &data)
{
/*
QJsonParseError json_error;
QJsonDocument parse_document = QJsonDocument::fromJson(byte_array,&json_error);
if(json_error.error == QJsonParseError::NoError)
{
if(parse_document.isArray())
{
QJsonArray array = parse_document.array();
int size = array.size();
for(int i = 0;i<size;i++)
{
QJsonValue value = array.at(i);
if(value.isString())
{
QString name=value.toString();
}
else if(value.isBool())
{
bool flag = value.toBool();
}
else if(value.isDouble())
{
int version = value.toInt();
}
else if(value.isArray())
{
int aaa = 0;
}
}
}
}
*/
//QByteArray byte_array
//QByteArray byte_array
bool bRet = false;
QJsonParseError json_error;
QJsonDocument parse_document = QJsonDocument::fromJson(data.toUtf8(),&json_error);
if(json_error.error == QJsonParseError::NoError)
{
if(parse_document.isObject())
{
if(parse_document.isObject())
{
QJsonArray array = parse_document.array();
int size = array.count();
QJsonObject obj= parse_document.object();
size = obj.count();
QJsonObject::iterator it;
int count = 0;
for(it = obj.begin();it!=obj.end();)
{
count++;
QString key = QString("%1").arg(it.key());
key = key.trimmed();
QJsonValue jsonValue = obj.take(key);
if(jsonValue.isString())
{
qDebug()<<"--------isString-key-"<<QString("key[%1] value[%2]").arg(key).arg(jsonValue.toString());
}
if(jsonValue.isBool())
{
qDebug()<<"--------isString-key-"<<QString("key[%1] value[%2]").arg(key).arg(jsonValue.toBool());
}
if(jsonValue.isDouble())
{
qDebug()<<"--------isString-key-"<<QString("key[%1] value[%2]").arg(key).arg(jsonValue.toInt());
}
else if(jsonValue.isArray())
{
qDebug()<<"--------isArray-key-"<<QString("key[%1])").arg(key);
QJsonArray array = jsonValue.toArray();
qDebug()<<array.count();
for(int j=0;j<array.count();j++)
{
QJsonObject object = array[j].toObject();
size = object.count();
QJsonObject::iterator it1;
for(it1 = object.begin();it1!=object.end();)
{
QString key = it1.key();
qDebug()<<"--------it1-key-"<<it1.key();
QJsonValue jsonItem = object.take(key);
if(jsonItem.isString())
{
qDebug()<<"--------strItem-key-"<<QString("key[%1] value[%2]").arg(key).arg(jsonItem.toString());
}
if(jsonItem.isBool())
{
qDebug()<<"--------strItem-key-"<<QString("key[%1] value[%2]").arg(key).arg(jsonItem.toBool());
}
if(jsonItem.isDouble())
{
qDebug()<<"--------strItem-key-"<<QString("key[%1] value[%2]").arg(key).arg(jsonItem.toInt());
}
}
}
}
else if(jsonValue.isObject())
{
qDebug()<<"--------isobject";
}
}
}
}
}
return bRet;
}
bool PublicOperate::jsonpack(QByteArray &data, HBookingInfoVeryDay &bookinginfo, int type)
{
bool bRet = false;
return bRet;
}
bool PublicOperate::jsonparse(QByteArray &byte_array)
{
QJsonObject json;
json.insert("name",QString("Qt"));
json.insert("version",5);
json.insert("windows",true);
QJsonDocument document;
document.setObject(json);
byte_array = document.toJson(QJsonDocument::Compact);
QString json_str(byte_array);
qDebug()<<"--------json_str-----"<<json_str;
return true;
}
bool PublicOperate::jsonparse(QString &data, QByteArray &byte_array)
{
QJsonObject json;
QJsonObject jsonobj1;
jsonobj1.insert("name",QString("Qt"));
jsonobj1.insert("version",5);
jsonobj1.insert("windows",true);
QJsonObject jsonobj2;
jsonobj2.insert("name",QString("Qt"));
jsonobj2.insert("version",5);
jsonobj2.insert("windows",true);
QJsonArray jsonarray;
jsonarray.insert(0,jsonobj1);
jsonarray.insert(1,jsonobj2);
json.insert("content",jsonarray);
json.insert("id",QString("Qt"));
json.insert("count",5);
json.insert("detail",true);
QJsonDocument document;
document.setObject(json);
byte_array = document.toJson(QJsonDocument::Compact);
data = QString(byte_array);
QString json_str(byte_array);
qDebug()<<"---------json_str_array---"<<json_str;
/*
QJsonArray json;
json.insert(0,QString("Qt"));
json.insert(1,5);
json.insert(2,true);
QJsonDocument document;
document.setArray(json);
byte_array = document.toJson(QJsonDocument::Compact);
QString json_str(byte_array);
qDebug()<<"---------json_str_array---"<<json_str;
*/
return true;
}
bool PublicOperate::jsonparse(QByteArray &data,HBookingInfoVeryDay &bookinginfo,int type)
{
bool bRet = true;
QJsonObject json;
json.insert("date",bookinginfo.m_strDate);
json.insert("bookcount",bookinginfo.m_nBookcount);
QJsonArray arrayApp;
QHash<QString,HBookingInfo>::iterator mi;
for(mi = bookinginfo.m_hashBookingInfo.begin();mi!=bookinginfo.m_hashBookingInfo.end();mi++)
{
QJsonObject jsonchild;
jsonchild.insert("begintime",mi.value().m_strBeginTime);
jsonchild.insert("endtime",mi.value().m_strEndTime);
jsonchild.insert("subject",mi.value().m_strSubject);
jsonchild.insert("theme",mi.value().m_strTheme);
jsonchild.insert("abstract",mi.value().m_strAbStract);
jsonchild.insert("status",mi.value().m_bStatus);
jsonchild.insert("classcount",mi.value().m_nClassCount);
QJsonArray arrayChild;
QHash<QString,HClassInfo>::iterator mj;
for(mj = mi.value().m_hashClassInfo.begin();mj!=mi.value().m_hashClassInfo.end();mj++)
{
QJsonObject jsongrandson;
jsongrandson.insert("id",mj.value().m_strID);
jsongrandson.insert("ip",mj.value().m_strIP);
jsongrandson.insert("name",mj.value().m_strName);
jsongrandson.insert("detail",mj.value().m_strDetail);
jsongrandson.insert("identity",mj.value().m_strDetail);
arrayChild.append(jsongrandson);
}
jsonchild.insert(mi.key(),arrayChild);
arrayApp.append(jsonchild);
}
json.insert("content",arrayApp);
QJsonDocument document;
document.setObject(json);
QByteArray byte_array = document.toJson(QJsonDocument::Compact);
QString json_str(byte_array);
data = json_str.toUtf8();
qDebug()<<"-------"<<data;
return bRet;
}