ini,CSV,JSON,...
1 CSV
逗号分隔值(Comma-Separated Values,CSV,有时也称为字符分隔值,因为分隔字符也可以不是逗号),
2 JSON
2.1 QJsonValue
void remove(const QString &key);
QJsonValue take(const QString &key);
bool contains(const QString &key) const;
void remove(QStringView key);
void remove(QLatin1String key);
QJsonValue take(QStringView key);
QJsonValue take(QLatin1String key);
bool contains(QStringView key) const;
bool contains(QLatin1String key) const;
2.2 QJsonArray
删除数组 i;
void removeAt(int i); //jArray.removeAt(0); //ok //删除第0项
QJsonValue takeAt(int i); //qDebug() << jArray.takeAt(0).toInt() << endl; //删除第0项并返回值
替换:
QJsonArray jArray= configJson->RootObj().value("IP").toArray();
jArray.insert(3,jArray); //ok
jArray.replace(3,jArray); //ok
jArray[4]= 12; //无效 数组越界无效
jArray[0]= 54; //ok
(*configJson->RootObjPointer())["IP"]=jArray; //获取指针方式修改“IP”
configJson->savejsonfile();
2.3 QJsonObject
是否包含Student
QJsonObject obj=doc.object();
if(obj.contains("Student"))
{
}
2.4 [“IP”]
/*【】是用来填充数据使用 */
(*configJson->RootObjPointer())["IP"]=jArray;
/*.value 这种方式是用来获取数据*/
(*configJson->RootObjPointer()).value("IP")=jArray;
2.5 JSON注意事项:
- 数组中不能是00 “NightMode”: [18, 00, 0, 6, 0, 0] //解析不出来
- 数组中是int类型的数据 不要用QString 去替换,会不成功。
- 修改json类型要修改他的指针,重新填充数据要重新赋值给上层的父类,保存才能达到效果,不能获取的只是临时变量。(如下例子)
QJsonArray jArray= configJson->RootObj().value("IP").toArray();
jArray[4]= 12; //无效 (数组越界 )
jArray.insert(3,jArray); //ok (可以插入任意类型 )
jArray.replace(3,jArray); //ok (可以替换任意类型 )
jArray[0]= 54; //ok (数组不越界 )
(*configJson->RootObjPointer())["IP"]=jArray; //Ok (通过指针来获取“IP”,并赋值)
configJson->savejsonfile();
2.6 案例1
2.7 案例2
QByteArray byte;
QFile file(file_path);
if(file.exists()){
file.open(QIODevice::ReadOnly|QIODevice::Text);
byte=file.readAll();
file.close();
}
else
{
cout<<"openFileError"<<endl;;
}
QJsonParseError json_error;
QJsonDocument jsonDoc(QJsondocument::fromJson(byte,&json_error));
if(json_error.err!=QJsonParseError::NoError)
{
cout<<" json error "<<endl;
}
QJsonObject rootobj=jsonDoc.object();
//一般需要使用 rootobj.contains(xxx) 判断一下是否存在 这里我们就默认是存在的 。
QJsonObject A_obj=rootobj.value("A").toObject();
A_obj["AA"]=33;
QJsonArray B_array=rootobj.value("B").toArray();
QJsonObject B_Subobj=B_array[0].toObject();
QJsonArray b_array=B_Subobj.value("BB").toArray();
b_array.replace(0,"BBB");
B_Subobj["BB"]=b_array;
B_array.replace(0,B_Subobj);
QJsonObject C_obj=rootobj.value("C").toObject();
QJsonArray c_array=C_obj.value("CC").toArray();
c_array.replace(0,"CCC");
C_obj["CC"]=c_array;
rootobj["A"]=A_obj;
rootobj["B"]=B_array;
rootobj["C"]=C_obj;
QFile file(file_path);
if(file.exists()){
file.open(QIODevice::WriteOnly|QIODevice::Text);
jsonDoc.setObject(rootobj);
file.seek(0);
file.write(jsonDoc.toJson());
file.flush();
file.close();
}
3 ini
qreadini.h
#ifndef QREADINI_H
#define QREADINI_H
#include<QSettings>
#define DATACONFIG QReadIni::getInstance()->getIniConfig()
typedef struct IniConfig
{
QString ip; //IP地址
QString port; //端口
QString dataBaseVersion; //数据库版本
QString dataBaseName; //数据库名称
QString userName; //用户名
QString passWord; //密码
}IniConfig;
class QReadIni
{
public:
static QReadIni*getInstance();
void readIni();
const IniConfig &getIniConfig();
private:
QReadIni();
IniConfig iniConfig;
static QReadIni*instance;
};
#endif // QREADINI_H
qreadini.cpp
#include "qreadini.h"
QReadIni*QReadIni::instance = NULL;
QReadIni *QReadIni::getInstance()
{
if(instance == NULL)
{
instance = new QReadIni();
}
return instance;
}
QReadIni::QReadIni()
{
this->readIni();
}
void QReadIni::readIni()
{
QSettings * configIniRead = new QSettings("config.ini",QSettings::IniFormat);//初始化读取Ini文件对象
iniConfig.ip = configIniRead->value("conn/ip").toString(); //IP地址
iniConfig.port = configIniRead->value("conn/port").toString(); //端口
iniConfig.dataBaseVersion = configIniRead->value("conn/databaseversion").toString();//数据库版本
iniConfig.dataBaseName = configIniRead->value("conn/databasename").toString(); //数据库名称
iniConfig.userName = configIniRead->value("conn/username").toString(); //用户名
iniConfig.passWord = configIniRead->value("conn/password").toString(); //密码
delete configIniRead;
}
const IniConfig &QReadIni::getIniConfig()
{
return iniConfig;
}
写ini文件
#include <QtCore/QCoreApplication>
#include <QSettings>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
//Qt中使用QSettings类读写ini文件
//QSettings构造函数的第一个参数是ini文件的路径,第二个参数表示针对ini文件,第三个参数可以缺省
QSettings *configIniWrite = new QSettings("hahaya.ini", QSettings::IniFormat);
//向ini文件中写入内容,setValue函数的两个参数是键值对
//向ini文件的第一个节写入内容,ip节下的第一个参数
configIniWrite->setValue("/ip/first", "192.168.0.1");
//向ini文件的第一个节写入内容,ip节下的第二个参数
configIniWrite->setValue("ip/second", "127.0.0.1");
//向ini文件的第二个节写入内容,port节下的第一个参数
configIniWrite->setValue("port/open", "2222");
//写入完成后删除指针
delete configIniWrite;
return a.exec();
}
4 xml
- 新建类 ReadWriteXml
readwritexml.h
#ifndef READWRITEXML_H
#define READWRITEXML_H
#include<QtXml>
#include<QFile>
class ReadWriteXml
{
public:
ReadWriteXml();
bool writeToXml(const QString &xmlPath);
bool readFromXml(const QString &xmlPath);
protected:
virtual void readFromDocument(const QDomElement &rootElement)=0;
virtual void writeToDocument(QDomDocument &doc)=0;
private:
QDomDocument m_doc;
QFile m_file; //打开一个xml文件
};
#endif // READWRITEXML_H
readwritexml.cpp
#include "readwritexml.h"
ReadWriteXml::ReadWriteXml()
{
}
bool ReadWriteXml::writeToXml(const QString &xmlPath)
{
m_doc.clear();
QDomProcessingInstruction ins;
ins=m_doc.createProcessingInstruction("xml","version=\'1.0\' encoding=\'UTF-8\'");
m_doc.appendChild(ins);
writeToDocument(m_doc); //写数据到m_doc
m_file.setFileName(xmlPath);
bool isOk=m_file.open(QIODevice::WriteOnly);
if(isOk==false)
{
return false;
}
QTextStream stream(&m_file);//m_doc 保存到硬盘
m_doc.save(stream,4);
m_file.close();
return true;
}
bool ReadWriteXml::readFromXml(const QString &xmlPath)
{
m_file.setFileName(xmlPath);
bool isOk=m_file.open(QIODevice::ReadOnly);
if(isOk==false)
{
return false;
}
m_doc.setContent(&m_file);
//获得xml根节点
QDomElement rootElement=m_doc.documentElement();
//以上部分读xml文件固定套路
//下边是具体从根节点读出xml中信息,实际怎么读要根据具体工程,所以写成纯虚函数,具体应用时实现
readFromDocument(rootElement);
m_file.close();
return true;
}
- 新建XmlReadTest类继承ReadWriteXml
readwritexml.h
#ifndef XMLREADTEST_H
#define XMLREADTEST_H
#include"readwritexml.h"
class XmlReadTest : public ReadWriteXml
{
public:
XmlReadTest();
protected:
virtual void readFromDocument(const QDomElement &rootElement);
virtual void writeToDocument(QDomDocument &doc);
private:
};
#endif // XMLREADTEST_H
readwritexml.cpp
#include "xmlreadtest.h"
#include<QDebug>
XmlReadTest::XmlReadTest()
{
}
void XmlReadTest::readFromDocument(const QDomElement &rootElement)
{
static int i=1; //打印节点顺序号
int num=0;//计算距离根节点的辈数
QDomNode parentNode=rootElement.parentNode();
while (parentNode.isNull()==false)
{
num++;
parentNode=parentNode.parentNode();
}
QString str=rootElement.attribute("name");
//根据辈数输出定位,以便打印时有层次感
qDebug()<<QString("%1:%2").arg(i++).arg(str,num*4); //读出本节点信息,处理信息
QDomElement child=rootElement.firstChildElement("Label");//试图获取长子节点
while(child.isNull()==false)
{
readFromDocument(child); //节点存在,递归调用,继续获取后代信息
child=child.nextSiblingElement("Label");//试图获取兄弟节点
}
}
void XmlReadTest::writeToDocument(QDomDocument &doc)
{
Q_UNUSED(doc)
}
- mainwindow
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include"xmlreadtest.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
XmlReadTest readTest;
//xml路径修改为自己xml路径
readTest.readFromXml("D:/Project_Qt_01/build-readxml-Desktop_Qt_5_12_9_MinGW_64_bit-Debug/debug/config.xml");
}
MainWindow::~MainWindow()
{
delete ui;
}