任务要求:给定一组文件的路径,解读文件路径并将文件结构以树形显示到QTreeWidget对象上。
实现思路:使用ui,ui界面上只放一个树控件。实现效果:
主函数:
int main(int argc, char *argv[])
{ QApplication a(argc, argv);
//测试显示,使用QTreeWidget实现
QList<QString> listFileNames;
listFileNames<<"F:/BinaryData/testData1.dat"<<"E:/BinaryData/testData2.dat"<<"D:/BinaryData/testData3.dat";
CFileDisplay *pDispFile=new CFileDisplay();
// pDispFile->DisplayFiles(listDir,listFileNames);
pDispFile->DisplayFiles(listFileNames);
return a.exec();
}
窗体头文件定义:
class CFileDisplay : public QWidget
{
Q_OBJECT
public:
explicit CFileDisplay(QWidget *parent = nullptr);
~CFileDisplay();
void InitTree();
void DisplayFiles(const QList<QString> &dir,const QList<QString> &fileNames);
void DisplayFiles(const QList<QString> &fileNames);
private:
Ui::CFileDisplay *ui;
};
窗体实现文件定义:
CFileDisplay::CFileDisplay(QWidget *parent) :
QWidget(parent),
ui(new Ui::CFileDisplay)
{
ui->setupUi(this);
ui->treeFiles->setHeaderHidden(true);
ui->treeFiles->setHeaderLabel(tr("文件查看")); //设置头的标题
}
CFileDisplay::~CFileDisplay()
{
delete ui;
}
void CFileDisplay::DisplayFiles(const QList<QString> &fileNames)
{
QTreeWidgetItem *myTreeWidgetItem=new QTreeWidgetItem();
myTreeWidgetItem->setText(0,"文件查看");
ui->treeFiles->addTopLevelItem(myTreeWidgetItem);
int lenFilenames=fileNames.size();
QString curName="";
QTreeWidgetItem* parent=nullptr;
for(int i=0;i<lenFilenames;i++)
{
QStringList listNames=fileNames[i].split('/');
QString root=listNames[0];
int loc=root.indexOf(':');
root=root.mid(loc-1,1);
qDebug()<<root;
QList<QTreeWidgetItem*> listItem=ui->treeFiles->findItems(root,Qt::MatchRecursive);
if(listItem.size()==0)
{
QTreeWidgetItem *myRootItem=new QTreeWidgetItem(ui->treeFiles);
myRootItem->setText(0,root);
parent=myRootItem;
}
else
parent=listItem[0];
QStringList::iterator it=listNames.begin()+1;
for(;it!=listNames.end();it++)
{
qDebug()<<(*it);
curName=(*it);
int countChildParent=parent->childCount();
if(countChildParent==0)//如果父结点没有孩子,则直接添加
{
QTreeWidgetItem *myChildItem=new QTreeWidgetItem;
int index=parent->childCount();
myChildItem->setText(0,curName);
parent->insertChild(index,myChildItem);
parent=myChildItem;
}
else //否则,检查父节点的孩子节点中是否存在当前字符串
{
for(int i=0;i<countChildParent;i++)
{
if(curName==parent->child(i)->text(i))
{
parent=parent->child(i);
break;
}
}
}
}
}
this->show();
}