QT固定檔名格式串轉化為TreeView在介面上展示檔案樹形目錄
阿新 • • 發佈:2019-02-17
獲得的檔案串格式:
file1/1 - sss.txt|file1/bin.zip|file2/linpanhu.docx|qmake_vc.bat|send.zip|
思路:====>>>
file1/1 - sss.txt
file1/bin.zip
file2/linpanhu.docx
qmake_vc.bat
send.zip
====>>>
file1 1 - sss.txt
file1 bin.zip
file2 linpanhu.docx
qmake_vc.bat
send.zip
====>>>
使用資料標識位置,掛在指定的ITem
//目錄樹的QStandardItem標識陣列,初始化置0,表示空
for (int i = 0; i < 20; i++)
{
use[i] = 0;
}
/*字串分割
* @param [in] 原字串,如“aaa|bbb|ccc|xxx|”
* @param [out] 返回分割後的字串列表
* @param [in] 分割的字元,如“|”
* @return 返回分割後的字串列表
*/
QList<QString> MainWindow::SplitString(const std::string& s, QList<QString> fileList, const std::string& c)
{
std::string::size_type pos1, pos2;
pos2 = s.find(c);
pos1 = 0;
while (std::string::npos != pos2)
{
fileList.append(QString::fromLocal8Bit(s.substr(pos1, pos2 - pos1).c_str())); //國際化,解決中文亂碼
pos1 = pos2 + c.size();
pos2 = s.find(c, pos1);
}
if (pos1 != s.length())
fileList.append(QString::fromLocal8Bit(s.substr(pos1).c_str())); //新增最後一段
return fileList;
}
//載入樹型目錄
void MainWindow::loadTreeDir(QList<QString> fileList)
{
//載入樹形目錄
QStandardItemModel* model = new QStandardItemModel(ui->fileTreeView);
//model->setHorizontalHeaderLabels(tr("檔案樹:")); //表頭
ui->fileTreeView->setModel(model);
QList<QList<QString>> fileDirList; //檔案目錄列表
QSet<QString> fileDirSet = QSet<QString>(); //目錄集合
QVector<QString> fileDirSet2;
//fileDirSet2.append("DTS_FILES");
for (int j = 0; j < fileList.size(); j++)
{
QList<QString> tempList; //
tempList = SplitString(fileList.at(j).toLocal8Bit().toStdString(), tempList, "/"); //按照“/”分割
fileDirList.append(tempList); //存入目錄列表
tempList.clear();//關鍵,不clear會有殘留資料
}
//sortDir(fileDirList); //目錄按級數排序
QStandardItem* itemp[20];
itemp[0] = new QStandardItem(tr("DTS_FILES")); //建立根目錄
itemp[0]->setIcon(QIcon(tr(":/images/dir_s.png"))); //設定icon
model->setItem(0, 0, itemp[0]); //通過模型物件新增條目
for (int k = 0; k < fileDirList.size(); k++)
{
QList<QString> temp = fileDirList.at(k);
for (int l = 0; l < temp.size(); l++)
{
if (!fileDirSet2.contains(temp.at(l)))
{
fileDirSet2.append(temp.at(l));
}
}
}
int local = 0;
//std::string ddd= "";
for (int ck = 0; ck < fileDirList.size(); ck++)
{
for (int m = 0; m < fileDirList.at(ck).size(); m++)
{
//ddd = fileDirList.at(ck).at(m).toStdString();
local = fileDirSet2.indexOf(fileDirList.at(ck).at(m)) + 1; ///值的位置,0的位置預設給DTS_FILES
if (use[local] != 1)//表示沒有此節點
{
itemp[local] = new QStandardItem(fileDirList.at(ck).at(m));
if (fileDirList.at(ck).at(m).contains(".")){ //是檔案
itemp[local]->setIcon(QIcon(tr(":/images/file_s.png"))); //設定icon
}
else
{
//是目錄
itemp[local]->setIcon(QIcon(tr(":/images/dir_s.png"))); //設定icon
}
//首位,一級目錄掛載在DTS_FILES下
if (m == 0)
{
use[local] = 1; //已經新增設為1
itemp[0]->appendRow(itemp[local]);
}
else
{
//找前面一個掛上
int frontLocal = fileDirSet2.indexOf(fileDirList.at(ck).at(m - 1)) + 1;
itemp[frontLocal]->appendRow(itemp[local]);
use[local] = 1; //已經添加了則設為1
}
}
}
}
showInfo(0, QString::fromLocal8Bit("載入目錄樹成功"));
}