QT固定文件名格式串转化为TreeView在界面上展示文件树形目录
程序员文章站
2022-03-04 11:48:50
...
获得的文件串格式:
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("加载目录树成功"));
}
上一篇: HTML 段落、折行
下一篇: TreeView 控件节点上下移动