Qt QTreeView 实现列表更新

背景:最近用到了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));
            }
        }
    }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值