QT固定文件名格式串转化为TreeView在界面上展示文件树形目录

获得的文件串格式:
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 MainWindow::SplitString(const std::string& s, QList 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 fileList)
{
    //加载树形目录
    QStandardItemModel* model = new QStandardItemModel(ui->fileTreeView);
    //model->setHorizontalHeaderLabels(tr("文件树:")); //表头
    ui->fileTreeView->setModel(model);

    QList> fileDirList;          //文件目录列表
    QSet fileDirSet = QSet(); //目录集合

    QVector fileDirSet2;
    //fileDirSet2.append("DTS_FILES");

    for (int j = 0; j < fileList.size(); j++)
    {
        QList 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 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("加载目录树成功"));
}

你可能感兴趣的:(QT,模板)