qt导入ini,xml文件
ini和xml文件
1、ini配置文件
ini文件简单的说就是一些配置文件,用来存储程序需要的配置信息
//简易版本
节
[section]
参数(键=值)
name=value
[tercher0] //节
name=张三
course=软件工程
time=20:00-22:00
hobby=DNF
2、ini操作
整个tableWidget
QSettings类,通过这个类操作,用的时候包含QTextCodec和QSettings头文件
插入一行
void Widget::on_pushButton_2_clicked()
{//插入
int row = ui->tableWidget->currentRow();//选中行
ui->tableWidget->insertRow(row+1);
}
删除一行
void Widget::on_pushButton_clicked()
{ //删除
int row = ui->tableWidget->currentRow();//选中行
ui->tableWidget->removeRow(row);
}
导出ini文件
void Widget::on_pushButton_3_clicked()
{//导出ini文件
//文件格式和字符编码
QSettings* config = new QSettings("people.ini",QSettings::IniFormat);
config->setIniCodec(QTextCodec::codecForName("utf-8"));
//有多少行,就写入多少个
for(int i=0;i<ui->tableWidget->rowCount();++i)
{
QString settion=QString("people%1").arg(i);
config->beginGroup(settion); //节点的开始
config->setValue("ID",ui->tableWidget->item(i,0)->text());//设置键值对,ID和tableWidget中第i列第0个数据的文本
config->setValue("name",ui->tableWidget->item(i,1)->text());
config->setValue("post",ui->tableWidget->item(i,2)->text());
config->endGroup();
}
delete config; //释放掉
}
导出的ini文件如下
读取ini文件
void Widget::on_pushButton_3_clicked()
{//导出ini文件
QSettings* config = new QSettings("people.ini",QSettings::IniFormat);
config->setIniCodec(QTextCodec::codecForName("utf-8"));
for(int i=0;i<ui->tableWidget->rowCount();++i)
{
QString settion=QString("people%1").arg(i);
config->beginGroup(settion); //节点的开始
config->setValue("ID",ui->tableWidget->item(i,0)->text());//设置键值对,ID和tableWidget中第i列第0个数据的文本
config->setValue("name",ui->tableWidget->item(i,1)->text());
config->setValue("post",ui->tableWidget->item(i,2)->text());
config->endGroup();
}
delete config; //释放掉
}
void Widget::on_pushButton_4_clicked()
{//导入ini文件
int currentRow;
int currentCoumn;
QString itemID;
QString itemName;
QString itemPost;
QSettings *config = new QSettings("people.ini", QSettings::IniFormat);
config->setIniCodec(QTextCodec::codecForName("utf-8"));
//不知道文件里有多少个section 假设最多有20个section
for (int i = 0; i < 20; i++)
{
QString section = QString("people%1/").arg(i);
if (config->value(section + "name").toString().isEmpty())
{
//break; //可能有空值(有section 无value)
continue;
}
ui->tableWidget->insertRow(i);
currentRow = i;
currentCoumn = 0;
itemID = config->value(section + "ID").toString();
ui->tableWidget->setItem(currentRow, currentCoumn,new QTableWidgetItem(itemID));
itemName = config->value(section + "name").toString(); //key 得到value
currentCoumn = 1;
ui->tableWidget->setItem(currentRow, currentCoumn,new QTableWidgetItem(itemName));
itemPost = config->value(section + "post").toString(); //key 得到value
currentCoumn = 2;
ui->tableWidget->setItem(currentRow, currentCoumn,new QTableWidgetItem(itemPost));
}
delete config;
}
3、xml文件
包含头文件QXmlStreamWriter、QXmlStreamReader。使用xml文件时还用到QFile
导出xml文件
void Widget::on_pushButton_5_clicked()
{
//导出xml
QFile file("./test.xml");
file.open(QFile::WriteOnly|QFile::Truncate);//打开这个文件,如果不存在新建一个
QXmlStreamWriter writer(&file);
writer.setCodec((QTextCodec::codecForName("utf-8")));
writer.setAutoFormatting(true); //排版格式:自动排版
writer.writeStartDocument(); //开始写
writer.writeStartElement("peoples"); //开始记号
for(int i=0;i<ui->tableWidget->rowCount();++i)
{
writer.writeStartElement("people"); //开始记号,在上个记号的里面
writer.writeAttribute("id",QString("%1").arg(i));//额外写的id
writer.writeAttribute("ID",ui->tableWidget->item(i,0)->text());
writer.writeAttribute("name",ui->tableWidget->item(i,1)->text());
writer.writeTextElement("post",ui->tableWidget->item(i,2)->text()); //换一行写
writer.writeEndElement();//结束记号
}
writer.writeEndElement();//结束记号
writer.writeEndDocument();//结束写
file.close(); ///关闭文件
}
读取xml文件
void Widget::on_pushButton_6_clicked()
{
//导入xml
int row = 0;//行
int col = 0;//列
QString str;
QFile file("./test.xml");
if (!file.open(QFile::ReadOnly | QFile::Text))
{
qDebug() << file.errorString();//打开失败就输出错误信息
return;
}
QXmlStreamReader reader; //QXmlStreamReader reader(&file);可以用这一句就不用下面一句
reader.setDevice(&file);
while (!reader.atEnd())//没有读到文档末尾就继续读
{
//读取下一个记号
QXmlStreamReader::TokenType type = reader.readNext();
if (type == QXmlStreamReader::StartDocument)
{
//输出字符集编码和版本
qDebug() << reader.documentEncoding() << reader.documentVersion();
}
if (type == QXmlStreamReader::StartElement) //读开始标记
{
if ((reader.attributes().hasAttribute("id")) &&
(reader.attributes().hasAttribute("ID")) &&
(reader.attributes().hasAttribute("name")))
{
col = 0;
ui->tableWidget->insertRow(row);
//id不需要写入tablewidget中
/*str = reader.attributes().hasAttribute("id");
ui.tableWidget->setItem(row, col, new QTableWidgetItem(str));
col++;
*/
str = reader.attributes().value("ID").toString();//将读取的数据转为字符串
ui->tableWidget->setItem(row, col, new QTableWidgetItem(str));//将字符串赋值给tableWidget
col++;
str = reader.attributes().value("name").toString();
ui->tableWidget->setItem(row, col, new QTableWidgetItem(str));
col++;
row++;
}
}
if (type == QXmlStreamReader::Characters&&!reader.isWhitespace())//
{
static int trow = 0;
static int tcol = 2;
//qDebug() << reader.text();
str = reader.text().toString();
//str = reader.attributes().value("post").toString();
ui->tableWidget->setItem(trow, tcol, new QTableWidgetItem(str));
tcol++;
if (tcol == 3)
{
tcol = 2;
trow++;
}
}
}
file.close();
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律