1.在菜单中打开xml,把内容读取到 tablewidget进行显示:
1.本程序实现了xml读取、xml写入、检索
读取:
{
QDomDocument doc;
QFile file(_xmlFilePath);
//QTextCodec *vCodec = QTextCodec::codecForName("UTF-8");
//QByteArray encodedString;
//QTextCodec *codec = QTextCodec::codecForName("KOI8-R");
if(!file.open(QIODevice::ReadOnly))
{
QMessageBox msgBox;
msgBox.setText("error.");
msgBox.setInformativeText("Do you know ?");
msgBox.setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel);
msgBox.setDefaultButton(QMessageBox::Cancel);
int ret = msgBox.exec();
switch (ret)
{
case QMessageBox::Ok:
return;
break;
case QMessageBox::Cancel:
return;
break;
default:
return;
break;
}
}
if(!doc.setContent(&file))
{
file.close();
return ;
}
file.close();
QDomNode firstNode = doc.firstChild();//第一个节点
qDebug() << "Node name "<<qPrintable(firstNode.nodeName())
<< "value "<<qPrintable(firstNode.nodeValue()) ;
//返回跟元素
QDomElement docElem = doc.documentElement();
//返回根节点的第一个节点
QDomNode n = docElem.firstChild();
int line = 0;
int row = 0;
while(!n.isNull()) // 节点不为空则转到下个节点
{
//如果节点是元素
if(n.isElement())
{
//将结点转换为元素
QDomElement e = n.toElement();
//返回元素标记的id属性值
qDebug()<<"student"<<qPrintable(e.tagName())
<<"<-->id"<<qPrintable(e.attribute("sid"));
tablemViewmodel->setItem(line,row , new QStandardItem(e.attribute("sid")));
tablemViewmodel->item(line,row)->setForeground(QBrush(QColor(88,88,255)));
//获得元素e节点的所有子节点列表
//row++;//列 ++
QDomNodeList listNum = e.childNodes();
for(int i = 0 ;i<listNum.count() ; ++i)
{
QDomNode node = listNum.at(i);
if(node.isElement())
{
//qPrintable()
qDebug()<<"read编码name:"<<node.toElement().tagName()
<<"<-->text:"<<node.toElement().text(); // qPrintable()
tablemViewmodel->setItem(line,i+1 , new QStandardItem(node.toElement().text()));
tablemViewmodel->item(line,i+1)->setForeground(QBrush(QColor(88,88,255)));
}
}
}
//转到下一个兄弟节点
n = n.nextSibling();
line++;//hang ++
}
}
写入:
QFile file(_xmlFilePath);
if(!file.open(QIODevice::ReadOnly))
{
return;
}
QDomDocument doc;
if(!doc.setContent(&file))
{
file.close();
return;
}
file.close();
qDebug() << "updateToXmlFile ok " ;
//一标签名进行查找
QDomNodeList doclist = doc.elementsByTagName(QString("sid"));
for(int i=0; i < doclist.count() ;i++)
{
QDomElement e = doclist.at(i).toElement();//得到标签的对象
if(e.attribute(QString("sid")) == strId ) // 找到strId
{
//如果元素的编号属性与我们的相同
QDomNodeList child = doclist.at(i).childNodes();
child.at(0).toElement().firstChild().setNodeValue(strId);//id 不可以改变
child.at(1).toElement().firstChild().setNodeValue(strName);
child.at(2).toElement().firstChild().setNodeValue(strAge);
child.at(3).toElement().firstChild().setNodeValue(strSex);
//用于保存update
QFile file(_xmlFilePath);
if(!file.open(QIODevice::WriteOnly | QIODevice::Truncate))
{
return;
}
QTextStream out(&file);//文本流
doc.save(out,4);//设置上面去
file.close();
}
}
检索:
{
QFile file(_xmlFilePath);
if(!file.open(QIODevice::ReadOnly))
return;
QDomDocument doc;
if(!doc.setContent(&file))
{
file.close();
return;
}
file.close();
clearVectorVector();//清除查找结果
QDomNode firstNode = doc.firstChild();//第一个节点
//返回跟元素
QDomElement docElem = doc.documentElement();
//返回根节点的第一个节点
QDomNode n = docElem.firstChild();
while(!n.isNull()) // 节点不为空则转到下个节点
{
QVector<QString> vec;
//如果节点是元素
if(n.isElement())
{
//将结点转换为元素
QDomElement e = n.toElement();
qDebug()<<"find<-->id"<<qPrintable(e.attribute("sid"));
//获得元素e节点的所有子节点列表
vec.append(e.attribute("sid"));
QDomNodeList listNum = e.childNodes();
for(int i = 0 ;i<listNum.count() ; ++i)
{
QDomNode node = listNum.at(i);
if(node.isElement())
{
qDebug()<<"findread编码name:"<<node.toElement().tagName()
<<"find<-->text:"<<node.toElement().text();
vec.append(node.toElement().text());
}
}
VecVec.append(vec);
}
//转到下一个兄弟节点
n = n.nextSibling();
}
showVector2Info();
findDateToTableView(strData);
}
2.通过修改tablewidget选中项可以操作保存功能:
2.1 保存所有的更改的信息
2.2 保存删除信息
2.3 保存更新的信息
2.4 保存增加的信息
3.可以通过界面操作撤销的功能:
3.1 撤销全部的修改
3.2 撤销更改
3.3 撤销删除
3.4 撤销增加
源代码:点击打开链接