天天看點

仿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