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();
}
posted @ 2022-10-18 22:05  宣哲  阅读(315)  评论(0编辑  收藏  举报