注意:這是一個demo,主要功能是,用戶自定義選擇一個文件夾,在QTreeWidget控件中展示這個文件夾的樹形結構,並且提供了將該樹結構存儲成xml文件的功能。
demo界面:
點擊選擇目錄按鈕,可任意選擇一個目錄,點擊生成xml,選擇存儲路徑和名稱,即可把目錄結構存儲成xml文件。
當然,具體的xml的節點名稱,你可以自定義修改,下面給出源碼,源碼也參考了網上一些並進行了自適應的修改。
lmainwindow.h
#ifndef LMAINWINDOW_H #define LMAINWINDOW_H #include <QMainWindow> #include<QFileDialog> #include<QDirModel> #include<QTreeWidget> #include<QTreeWidgetItem> #include <QTextStream> #include <QDomElement> #include<QMessageBox> namespace Ui { class lMainWindow; } class lMainWindow : public QMainWindow { Q_OBJECT public: explicit lMainWindow(QWidget *parent = 0); ~lMainWindow(); void LoadFiles(QString path, QTreeWidget *treewidget, QTreeWidgetItem *item); bool SaveXML(QString fileName, QTreeWidget *pTreeWg); void savechilddom(QDomElement root,QTreeWidgetItem* projectItem,QDomDocument doc); private slots: void on_pushButton_clicked(); void on_pushButton_2_clicked(); private: Ui::lMainWindow *ui; }; #endif // LMAINWINDOW_H
lmainwindow.cpp
#include "lmainwindow.h" #include "ui_lmainwindow.h" lMainWindow::lMainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::lMainWindow) { ui->setupUi(this); } lMainWindow::~lMainWindow() { delete ui; } void lMainWindow::on_pushButton_clicked() { QString srcDirPath = QFileDialog::getExistingDirectory( this, "選擇路徑", "D:"); if (srcDirPath.isEmpty()) { return; } ui->lineEdit->setText(srcDirPath); QString pathStr = srcDirPath.right(srcDirPath.size()-srcDirPath.lastIndexOf("/")-1); // QTreeWidgetItem *treeItem1 = new QTreeWidgetItem(ui->treeWidget, QStringList(pathStr)); QTreeWidgetItem *treeItem1 = new QTreeWidgetItem(ui->treeWidget, QStringList(pathStr), 0); //0表示目錄 LoadFiles(srcDirPath, ui->treeWidget, treeItem1); } void lMainWindow::LoadFiles(QString path, QTreeWidget *treewidget, QTreeWidgetItem *item) { if (treewidget != NULL) treewidget->addTopLevelItem(item); QDir dir(path); if (!dir.exists()) return; dir.setFilter(QDir::Dirs | QDir::Files | QDir::NoSymLinks); QFileInfoList list = dir.entryInfoList(); int size = list.size(); for (int i = 0; i < size; i++) { QFileInfo info = list.at(i); if (info.fileName() == "." || info.fileName() == "..") continue; if (info.isDir()) { QTreeWidgetItem *fileItem = new QTreeWidgetItem(QStringList() << info.fileName(), 0); //0表示目錄 if (treewidget == NULL) item->addChild(fileItem); // else treewidget->addTopLevelItem(fileItem); else item->addChild(fileItem); LoadFiles(info.filePath(), NULL, fileItem); } else { QTreeWidgetItem *fileItem = new QTreeWidgetItem(QStringList() << info.fileName(), 1); //1表示是文件 if (treewidget == NULL) item->addChild(fileItem); // else treewidget->addTopLevelItem(fileItem); else item->addChild(fileItem); } } } void lMainWindow::savechilddom(QDomElement root,QTreeWidgetItem* projectItem,QDomDocument doc) { int countSystem = projectItem->childCount(); for (int i = 0; i < countSystem; i++) { QTreeWidgetItem *systemItem = projectItem->child(i); QString systemName = systemItem->text(0); QDomElement elementSystem = doc.createElement("SystemStr"); QDomAttr elementSystemAttr = doc.createAttribute("NameStr"); elementSystemAttr.setValue(systemName); elementSystem.setAttributeNode(elementSystemAttr); root.appendChild(elementSystem); savechilddom(elementSystem,systemItem,doc); } } bool lMainWindow::SaveXML(QString fileName, QTreeWidget *pTreeWg) { QTreeWidgetItem *rootItem = pTreeWg->invisibleRootItem(); //樹的根節點 QString aaa=rootItem->child(0)->text(0); int countSystem = rootItem->childCount(); if (countSystem <= 0) //列表樹沒有項 { return false; } QFile db(fileName); if (!db.open(QIODevice::WriteOnly | QIODevice::Truncate)) return false; //只寫方式打開,並清空以前的信息 QDomDocument doc; QDomProcessingInstruction instruction; instruction = doc.createProcessingInstruction("xml", "version=\"1.0\" encoding=\"UTF-8\""); doc.appendChild(instruction); QDomElement root = doc.createElement("Root"); QString projectName ="projectname" ; QDomAttr elementProjAttr = doc.createAttribute("NameStr"); elementProjAttr.setValue(projectName); root.setAttributeNode(elementProjAttr); doc.appendChild(root); //添加根元素 QTreeWidgetItem* projectItem = rootItem->child(0); savechilddom(root,projectItem,doc); QTextStream out(&db); out.setCodec("UTF-8"); doc.save(out, 4); db.close(); return true; } void lMainWindow::on_pushButton_2_clicked() { // 將文件另存為docbyqt.doc,關閉工作文檔,退出應用程序 QString filename = QFileDialog::getSaveFileName(this, "導出XML文件", "D:/Output", tr("*.xml;; *.XML")); //選擇路徑 if (filename.isEmpty()) { return; } bool isok=SaveXML(filename, ui->treeWidget); if(isok!=false) QMessageBox::information(NULL,"提示","成功導出",QMessageBox::Ok); }
有任何疑惑或者問題,請進一步交流學習。