背景:最近用到了treeView控件,来显示指定文件夹里的所有文件,文件因为有更新,因此实现了一个右键菜单点击刷新列表的功能。
本来以为这个功能很简单,只需要把原来的treeview或者model删除了,重新加载一次就好了,也看到有网友提供这样类似的方法,但是自己尝试了多次都没有实现,清空model->clear()后,程序直接崩溃,貌似原因是这样做了model将不能再次被使用。。。在网上看了很多资料,都没有找到一种合适的解决办法。
解决办法:最终自己只能用笨方法解决了。思路:遍历文件夹中的文件与treeview中的项,把两者作比较,如果列表中已经存在了文件,就不再添加,否则才添加文件,即可以达到更新列表的功能需求。(虽然复杂了许多的感觉,但至少功能实现了)
下面是实现该功能的代码,我是在工作目录下的lxjcData文件夹里查找txt文件,并添加到treeview列表里。
QString filePath1 = ".//lxjcData";
QDir *dir1 = new QDir(filePath1);
QStringList filter1;
filter1 << "*.txt"; //用来文件过滤用的,如果你要指定文件后缀名,这样写filter<<"*.dat" 就好了,如果要指定多个后缀名,这样写filter<<"*.dat"<<"*.txt"就行了
dir1->setNameFilters(filter1);
QList<QFileInfo> *fileInfo1 = new QList<QFileInfo>(dir1->entryInfoList(filter1));
if(!model->item(0)->hasChildren()) //先判断之前添加的固定项item(0)下面有没有子项,没有就添加所有文件
{
for(int i = 0; i<fileInfo1->count(); i++)
{
model->item(0)->appendRow(new QStandardItem(fileInfo1->at(i).fileName()));
}
}
else //如果有子项,表示已经存在一些文件在列表中,需要遍历文件夹与所有子项作比较,列表里没有的就添加进去
{
Q_ASSERT(model->item(0));
for(int i = 0; i<fileInfo1->count(); i++) //遍历文件夹
{
bool isExist = false; //用作表明文件在列表是否已经存在,若存在则为true
QString s1 = fileInfo1->at(i).fileName();
for(int j = 0; j < model->item(0)->rowCount(); j++) //遍历item(0)下的子项,即已经显示的文件
{
QStandardItem * childitem = model->item(0)->child(j);
QString s2 = childitem->text();
if(s1.compare(s2) == 0) //将文件夹下的文件与列表里的所有作比较,相等返回0,有一个相对就表明已经存在
{
isExist = true; //存在就改为true
}
}
if(isExist == false) //与列表比较忘了仍然为假的话,表示列表里没有这个文件,则添加进去
{
model->item(0)->appendRow(new QStandardItem(s1));
}
}
}