天天看点

仿QFileSystemModel将文件目录在QTreeView中显示

因为工作需要显示指定文件下的文件夹下的目录,但是QFileSystemModely不熟重写的时候没有达到指定的效果,所以用其他方法做了个类似的:

仿QFileSystemModel将文件目录在QTreeView中显示
仿QFileSystemModel将文件目录在QTreeView中显示
void MainWindow::refreshTree()      
{      
QString path ="X:/XXXX/XXXX/Tencent Files";      
newfile= new FileTree();   //设置根节点信息      
QStringList strlist = path.split("/");      
QString name = strlist.at(strlist.count() - 1);      
newfile->setFileName(name);  //文件名      
newfile->setPathName(path);  //文件路径
      
GetAllFileFolder(NULL, path);//递归获取文件目录并将目录按层保存
      
appendNode(NULL, m_PFile);  //添加到treeView      
}      
void MainWindow::GetAllFileFolder(FileTree* pfile, QString dirPath)      
{      
QDir dir(dirPath);      
FileTree* file;  //自定义用来保存文件信息
      
QFileInfoList folder_list = dir.entryInfoList(QDir::Dirs | QDir::NoDotAndDotDot);
      
for(int i = 0; i != folder_list.size(); i++)      
{      
if(folder_list.at(i).fileName() == "." || folder_list.at(i).fileName() == "..") continue;      
QString name = folder_list.at(i).absoluteFilePath();
      
file = new FileTree();      
QString fileName = folder_list.at(i).fileName();      
QString pathName = folder_list.at(i).filePath();
      
file->setFileName(fileName);      
file->setPathName(pathName);
      
addNode(pfile, file);  
      
GetAllFileFolder(file, name);
      
}      
}      
void MainWindow::addNode(FileTree *aPFile, FileTree *afile) //保存节点      
{      
FileTree* file = aPFile;      
if(m_PFile == NULL)      
{
      
m_PFile = newfile;
      
}      
if(file == NULL)      
{             
file = m_PFile;      
}else{
      
}         
file->addSubIten(afile);      
}      
void MainWindow::appendNode(QStandardItem *pitem, FileTree *node)      
{
      
QStandardItem* item = new QStandardItem;      
item->setText(node->fileName());      
item->setData(qVariantFromValue((int)(node)), Qt::UserRole);
      
if (pitem == NULL)      
{      
m_itemModel->appendRow(item);      
}else{      
pitem->appendRow(item);      
}
      
for(int i = 0; i <node->itemCount(); i++)      
{      
appendNode(item, node->at(i));      
}      
}      

效果图:

仿QFileSystemModel将文件目录在QTreeView中显示

缺点是不能实时监测指定文件夹下目录的变化,所以初始化的时候获取目录总个数开个线程利用定时器判断目录个数是否发生变化,然后重新刷新组织树

下载:https://download.csdn.net/download/u010304326/10824828