Qt遍历文件夹特定文件+QTreeWidget控件显示

本文总结Qt特定文件夹下特定类型文件,并将文件显示在QTreeWidget的两种方法。

需求:遍历特定文件夹及其子文件夹下所有.xml文件,并在QTreeWidget控件下树形显示目录及子目录下xml文件,以D:\xml\test_cases路径为例,test_cases文件夹内容如下所示:

子文件夹estimate_cases内容如下图所示:

  1. QDirIterator迭代器方法

void XmlTreeWidget::showTree(QString sPath,QTreeWidgetItem* pParentItem)
{
    // 判断路径是否存在
    QDir dir(sPath); // sPath待遍历路径
    if(!dir.exists())
    {
        return;
    }

    QTreeWidgetItem* pRoot;

    int pos1 = sPath.lastIndexOf('\\');
    int pos2 = sPath.lastIndexOf('/');
    int pos = pos1>pos2? pos1:pos2;
    assert(pos>=0);
    QString sDirName =sPath.mid(pos+1);

    if(pParentItem == nullptr)
    {
        QTreeWidgetItem* pItem = new QTreeWidgetItem(this);
        pItem->setText(0,sDirName);
        pItem->setIcon(0,QIcon(":/icons/live_folder_2.svg"));
        addTopLevelItem(pItem);
        pRoot = pItem;
    }
    else{

        QTreeWidgetItem* pItem = new QTreeWidgetItem;
        pItem->setText(0,sDirName);
        pItem->setIcon(0,QIcon(":/icons/live_folder_2.svg"));
        pParentItem->addChild(pItem);
        pRoot = pItem;
    }



    // 定义迭代器并设置过滤器
    QDirIterator dir_iterator(sPath,
      QDir::Dirs|QDir::Files|QDir::NoDotAndDotDot|QDir::NoSymLinks);
    QStringList string_list;
    while(dir_iterator.hasNext())
    {
        dir_iterator.next();
        QFileInfo file_info = dir_iterator.fileInfo();
        QString sName = file_info.fileName();
        if(file_info.isDir()){
            showTree(file_info.absoluteFilePath(),pRoot);
        }
        else {
            if(QString::compare(file_info.suffix(),"xml")==0){
                QTreeWidgetItem* pItem = new QTreeWidgetItem;
                pItem->setText(0,sName);
                pItem->setIcon(0,QIcon(":/icons/xml1.svg"));
                pRoot->addChild(pItem);
            }
        }

    }
}
  1. QFileInfoList方法

QDir dir(sPath);
    if(!dir.exists())
    {
        return;
    }
    dir.setFilter(QDir::Dirs|QDir::Files|QDir::NoDotAndDotDot|QDir::NoSymLinks);
    QFileInfoList list = dir.entryInfoList();

    int file_count = list.count();
    if(file_count <= 0)
    {
        return;
    }

    QStringList string_list;
    for(int i=0; i<file_count; i++)
    {
        QFileInfo file_info = list.at(i);
        QString sName = file_info.fileName();
        if(file_info.isDir()){
            showTree(file_info.absoluteFilePath(),pRoot);
        }
        else {
            if(QString::compare(file_info.suffix(),"xml")==0){
                QTreeWidgetItem* pItem = new QTreeWidgetItem;
                pItem->setText(0,sName);
                pItem->setIcon(0,QIcon(":/icons/xml1.svg"));
                pRoot->addChild(pItem);
            }
        }

    }
  1. 获取双击节点路径

QString XmlTreeWidget::getFileName(QTreeWidgetItem *pItem, int column)
{
    QTreeWidgetItem *pHeadItem = topLevelItem(0);
    QString txt = pItem->text(column);
    QString file_path;
    if(QString::compare(txt.right(4),".xml")==0){
        file_path = txt;
        QTreeWidgetItem* pParentItem = pItem->parent();
        while (pParentItem!=nullptr && pParentItem!=pHeadItem) {

            file_path = pParentItem->text(0) + "\\" + file_path;
            pParentItem = pParentItem->parent();
        }
        file_path = m_sWorkPath + "\\" + file_path;

    }

    return file_path;
}

效果图:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值