0
点赞
收藏
分享

微信扫一扫

【Qt入门实践】数据库xml操作



Qt的xml篇:

    建立Qt工程,使用的是GUI显示的。


本代码所使用的xml文件截图:


提供自己写的源码:

头文件部分------------------------------------------
 widget010.h
 
 #ifndef WIDGET010_H
 #define WIDGET010_H
 
 //#include <QWidget>
 #include <QtCore>
 #include <QtGui>
 #include <QtXml/QtXml>
 #include <QFile>
 #include <string>
 #include <stdlib.h>
 
 namespace Ui {
     class Widget010;
 }
 
 class Widget010 : public QWidget
 {
     Q_OBJECT
 
 public:
     explicit Widget010(QWidget *parent = 0);
     ~Widget010();
     void doXml(const QString operate);
 
 private:
     Ui::Widget010 *ui;
 
 private slots:
     void on_listWidget_clicked(QModelIndex index);
     void on_pushButtonUpdate_clicked();     //更新操作
     void on_pushButtonDelete_clicked();     //删除操作
     void on_pushButtonSelect_clicked();     //查询操作
     void on_pushButtonAdd_clicked();        //添加操作
     void on_pushButtonShowAll_clicked();    //显示所有数据操作
 };
 
 #endif // WIDGET010_H
 
 源码部分-------------------------------------
 widget010.cpp
 
 #include "widget010.h"
 #include "ui_widget010.h"
 
 Widget010::Widget010(QWidget *parent) :
         QWidget(parent),
         ui(new Ui::Widget010)
 {
     ui->setupUi(this);
 
     ui->listWidget->setSelectionBehavior(QAbstractItemView::SelectRows);   //设置选择动作
 }
 
 Widget010::~Widget010()
 {
     delete ui;
 }
 
 
 void Widget010::on_pushButtonShowAll_clicked()
 {
     ui->listWidget->clear();
    
     QFile file("my.xml");                                               //定义文件实例,xml文件名为my.xml
     qDebug()<<"hi,111";
 
     QDomDocument doc;
     bool flag1=file.open(QIODevice::ReadOnly);                        //以只读方式打开文件
     qDebug()<<"7777777777777777777"<<flag1;
     if(!flag1)
         return ;
 
     bool flag2=doc.setContent(&file);                                   //将文件以doc 形式显示内容
     qDebug()<<"8888888888888888888"<<flag2;
     if(!flag2)
     {
         file.close();
         return ;
     }
 
     file.close();                                                      //关闭xml文件,
     /***************************注:前面使用doc,是将操作文件的任务交给doc处理 ***********************/
 
     QDomElement docElem=doc.documentElement();
     QDomNode firstNode=docElem.firstChild();
     while(!firstNode.isNull())
     {
         if(firstNode.isElement())
         {
             QDomElement firstElem=firstNode.toElement();
 
             ui->listWidget->addItem(firstElem.tagName()+" "+firstElem.attribute("id"));
 
             QDomNodeList listNode=firstElem.childNodes();
 
             for(int i=0;i<listNode.count();i++)                  //从第一个节点开始,层层显示标签和元素内容
             {
                 QDomNode  node=listNode.at(i);
                 if(node.isElement())
                     ui->listWidget->addItem("  "+node.toElement().tagName()+" : "+node.toElement().text());
             }
         }
         firstNode=firstNode.nextSibling();
     }
 
 }
 
 void Widget010::on_pushButtonAdd_clicked()
 {
     ui->listWidget->clear();
     ui->listWidget->addItem(QString("无法添加!"));
    
 QFile file("my.xml");                                               //定义文件实例,xml文件名为my.xml
     qDebug()<<"hi,111";
 
     QDomDocument doc;
     bool flag1=file.open(QIODevice::ReadOnly);                        //以只读方式打开文件
     qDebug()<<"7777777777777777777"<<flag1;
     if(!flag1)
         return ;
 
     bool flag2=doc.setContent(&file);                                   //将文件以doc 形式显示内容
     qDebug()<<"8888888888888888888"<<flag2;
     if(!flag2)
     {
         file.close();
         return ;
     }
 
     file.close();                                                      //关闭xml文件,
     /***************************注:前面使用doc,是将操作文件的任务交给doc处理 ***********************/
 
     QDomElement root=doc.documentElement();
     QDomElement book=doc.createElement("book");
     QDomAttr id=doc.createAttribute("id");
     QDomElement title=doc.createElement("title");
     QDomElement author=doc.createElement("author");
     QDomText text;
 
     QString num=root.lastChild().toElement().attribute("id");  //子节点元素的添加,id是元素属性的自增操作
     int count=num.toInt()+1;
     id.setValue(tr("0")+QString::number(count));
     book.setAttributeNode(id);
     text=doc.createTextNode(ui->lineEditBookName->text());
     title.appendChild(text);
     text=doc.createTextNode(ui->lineEditBookMaker->text());
     author.appendChild(text);
     book.appendChild(title);
     book.appendChild(author);
 
     root.appendChild(book);
     if(!file.open(QIODevice::WriteOnly|QIODevice::Truncate))
     {
         return ;
     }
 
     QTextStream out(&file);
     doc.save(out,4);
     file.close();
     ui->listWidget->clear();
     ui->listWidget->addItem("添加成功.");
 }
 
 void Widget010::doXml(const QString operate)           //查、删、更新操作方法
 {
     ui->listWidget->clear();
     ui->listWidget->addItem("没有找到相关内容.");
 
    
 QFile file("my.xml");                                               //定义文件实例,xml文件名为my.xml
     qDebug()<<"hi,111";
 
     QDomDocument doc;
     bool flag1=file.open(QIODevice::ReadOnly);                        //以只读方式打开文件
     qDebug()<<"7777777777777777777"<<flag1;
     if(!flag1)
         return ;
 
     bool flag2=doc.setContent(&file);                                   //将文件以doc 形式显示内容
     qDebug()<<"8888888888888888888"<<flag2;
     if(!flag2)
     {
         file.close();
         return ;
     }
 
     file.close();                                                      //关闭xml文件,
     /***************************注:前面使用doc,是将操作文件的任务交给doc处理 ***********************/
 
     QDomNodeList list=doc.elementsByTagName("book");
     for(int i=0;i<list.count();i++)
     {
         QDomElement e=list.at(i).toElement();
         if(e.attribute("id")==ui->lineEditBookNum->text())
         {
             if(operate=="delete")
             {
                 QDomElement root=doc.documentElement();
                 root.removeChild(list.at(i));
                 QFile file("my.xml");
                 if(!file.open(QIODevice::WriteOnly|QIODevice::Truncate))        //只写操作更新,并且写入文件中
                 {
                     return ;
                 }
 
                 QTextStream out(&file);
                 doc.save(out,4);
                 file.close();
                 ui->listWidget->clear();
                 ui->listWidget->addItem("删除成功.");
             }
             else if(operate=="update")
             {
                 QDomNodeList child=list.at(i).childNodes();
                 child.at(0).toElement().firstChild().setNodeValue(ui->lineEditBookName->text());
                 child.at(1).toElement().firstChild().setNodeValue(ui->lineEditBookMaker->text());
                 QFile file("my.xml");
                 if(!file.open(QIODevice::WriteOnly|QIODevice::Truncate))
                 {
                     return ;
                 }
 
                 QTextStream out(&file);
                 doc.save(out,4);
                 file.close();
                 ui->listWidget->clear();
                 ui->listWidget->addItem("更新成功.");
             }
             else if(operate=="find")                 //查询
             {
                 ui->listWidget->clear();  
                 ui->listWidget->addItem(e.tagName()+e.attribute("id"));
                 QDomNodeList listNode=e.childNodes();
                 for(int i=0;i<listNode.count();i++)
                 {
                     QDomNode  node=listNode.at(i);
                     if(node.isElement())
                         ui->listWidget->addItem(" "+node.toElement().tagName()+":"+node.toElement().text());
                 }
             }
         }
     }
 
 }
 
 void Widget010::on_pushButtonSelect_clicked()                  //查询操作
 {
     doXml("find");
 }
 
 void Widget010::on_pushButtonDelete_clicked()                          //删除操作
 {
     doXml("delete");
 }
 
 void Widget010::on_pushButtonUpdate_clicked()                         //更新操作
 {
     doXml("update");
 }
 void Widget010::on_listWidget_clicked(QModelIndex index)                 //点击选择listwidget中某个记录,在lineEdit中相关的显示
 {
     if(!ui->listWidget->isItemSelected(ui->listWidget->currentItem()))   //首先判断时候被选上,否则退出
         return ;
 
     QFile file("my.xml");                                               //定义文件实例,xml文件名为my.xml
     qDebug()<<"hi,111";
 
     QDomDocument doc;
     bool flag1=file.open(QIODevice::ReadOnly);                        //以只读方式打开文件
     qDebug()<<"7777777777777777777"<<flag1;
     if(!flag1)
         return ;
 
     bool flag2=doc.setContent(&file);                                   //将文件以doc 形式显示内容
     qDebug()<<"8888888888888888888"<<flag2;
     if(!flag2)
     {
         file.close();
         return ;
     }
 
     file.close();                                                      //关闭xml文件,
     /***************************注:前面使用doc,是将操作文件的任务交给doc处理 ***********************/
 
     int curRow=ui->listWidget->currentIndex().row();                  //获取当前行数
     QDomElement root=doc.documentElement();                           //定义根元素
 
     if(curRow<0)                                                     //如果内容显示为空,则退出
     {
         return;
     }
     QListWidgetItem *itemTaget=ui->listWidget->item(curRow);
     QListWidgetItem *itemName=ui->listWidget->item(curRow+1);
     QListWidgetItem *itemMaker=ui->listWidget->item(curRow+2);          //获取当前项,本xml是设置第一个节点有两个元素,故,有三项
 
     if(itemTaget->text().contains("book"))                            //只有当选中项的内容含有“book”字符串的,进行显示
     {
         ui->lineEditTaget->setText(itemTaget->text().right(3));          //其中是对字符串进行截取显示
     }
     if(itemMaker->text().contains("author"))                          //同上
     ui->lineEditBookMaker->setText(itemMaker->text().right(itemMaker->text().size()-11));//同上
     if(itemName->text().contains("title"))                                       //同上
     ui->lineEditBookName->setText(itemName->text().right(itemName->text().size()-10));  //同上
 
 }


举报

相关推荐

0 条评论