本文总结Qt特定文件夹下特定类型文件,并将文件显示在QTreeWidget的两种方法。
需求:遍历特定文件夹及其子文件夹下所有.xml文件,并在QTreeWidget控件下树形显示目录及子目录下xml文件,以D:\xml\test_cases路径为例,test_cases文件夹内容如下所示:
子文件夹estimate_cases内容如下图所示:
-
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);
}
}
}
}
-
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);
}
}
}
-
获取双击节点路径
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;
}
效果图: