微信扫一扫

028-83195727 , 15928970361
business@forhy.com

Qt: QXmlStreamWriter Class写XML文件

Qt,QXmlStreamWriter Cla,写XML文件2016-11-07

需求:

使用QXMLStreamWriter,将如下界面的结构写入XML文件。



效果:



思路:

1、先构造树形控件treeWidget.

2、使用QXMLStreamWriter,写XML文件。


源码:

#include <QApplication>
#include <QXmlStreamWriter>
#include <QFile>
#include <QDebug>
#include <QTreeWidget>
#include <QTreeWidgetItem>
#include <QHeaderView>

void populateTree(QTreeWidget *treeWidget)//构造树
{
    treeWidget->setHeaderLabels(QStringList()<<"Terms" <<"Pages");
    treeWidget->header()->setSectionResizeMode(QHeaderView::Stretch);
    treeWidget->setWindowTitle(QObject::tr("XML Stream Writer"));
    treeWidget->show();

    (void) new QTreeWidgetItem(treeWidget, QStringList() << "sidebearings" << "10, 34-35, 307-308");
    QTreeWidgetItem *subTerm = new QTreeWidgetItem(treeWidget,QStringList() << "subtraction");
    (void) new QTreeWidgetItem(subTerm,QStringList() << "of pictures" << "115, 244");
    (void) new QTreeWidgetItem(subTerm,QStringList() << "of vectors" << "9");
}

void writeIndexEntry(QXmlStreamWriter *xmlWriter, QTreeWidgetItem *item )
{
    xmlWriter->writeStartElement("entry");;
    xmlWriter->writeAttribute("term",item->text(0));

    QString pageString = item->text(1);
    if(!pageString.isEmpty())
    {
        QStringList pages = pageString.split(",");
        foreach (QString page, pages) {
            xmlWriter->writeTextElement("page",page);
        }
    }
    for(int i=0; i<item->childCount() ; ++i)
        writeIndexEntry(xmlWriter,item->child(i));

    xmlWriter->writeEndElement();
}

bool writeXml(const QString &fileName, QTreeWidget *treeWidget)
{
    QFile file(fileName);
    if(!file.open(QFile::WriteOnly | QFile::Text))
    {
        qDebug()<< "Error: Cannot write file "
                <<fileName
               <<": "
              <<file.errorString();
        return false;
    }
    QXmlStreamWriter xmlWriter(&file);
    xmlWriter.setAutoFormatting(true);
    xmlWriter.writeStartDocument();
    xmlWriter.writeStartElement("bookindex");
    qDebug()<<"1: "<<treeWidget->topLevelItemCount();
    for(int i=0 ; i< treeWidget->topLevelItemCount() ; ++i)
        writeIndexEntry(&xmlWriter,treeWidget->topLevelItem(i));
    xmlWriter.writeEndDocument();

    file.close();
    if(file.error())
    {
        qDebug()<<"Error: Cannot write file "
               << fileName << ": "
               << file.errorString();
        return false;
    }
    return true;
}

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QTreeWidget treeWidget;
    populateTree(&treeWidget);
    writeXml("out1.xml", &treeWidget);

    return a.exec();
}