欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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("加载目录树成功"));
}
相关标签: TreeView