[QT]文件夹过滤问题

一、问题描述:

代码示例如下

 1 QTreeView *m_tree_view = new QTreeView;
 2 
 3 QFileSystemModel *dirModel  = new QFileSystemModel;
 4 dirModel->setFilter(QDir::Dirs | QDir::NoDotAndDotDot);
 5 dirModel->setRootPath(QDir::currentPath());
 6 
 7 m_tree_view->setModel(dirModel);
 8 
 9 QFileSystemModel *fileModel = new QFileSystemModel;
10 fileModel->setFilter(QDir::Files);
11 fileModel->setRootPath(QDir::currentPath());
12 
13 QSortFilterProxyModel *proxyModel = new QSortFilterProxyModel;
14 proxyModel->setSourceModel(fileModel);
15 
16 QListView  *m_list_view= new QListView;
17 m_list_view->setModel(proxyModel);

为了使得m_tree_view只显示文件夹列表,且m_list_view只显示文件列表。

让m_tree_view的setModel()函数都指向dirModel, m_list_view的setModel()函数指向proxyModel。 

然后让m_tree_view双击时连接到on_tree_clicked()函数:

1 void on_tree_clicked(QModelIndex index)
2 {
3     QModelIndex filePathIndex = dirModel->index(index.row(), 0, index.parent());
4     QString filePath = dirModel->filePath(filePathIndex);
5     m_list_view->setRootIndex(proxyModel->mapFromSource(fileModel->setRootPath(filePath)));
6 }

那么执行时,第一次在m_tree_view上点击父目录时,m_list_view只显示父目录下的文件,而过滤掉子文件夹。

但如果在m_tree_view上双击父目录下的任意一个子文件夹,然后再双击父目录,m_list_view就会显示刚才点击的子文件夹和父目录下所有的文件,而没有全部过滤掉文件夹。

 

二、原因:

fileModel->setRootPath(filePath) 会把filePath的index加入fileModel,而filter没改变的情况下不会再次进行过滤,所以被执行过setRootPath的文件夹都显示出来了。

三、解决办法:

在on_tree_clicked()的最后加上这2句
    fileModel->setFilter(QDir::NoFilter);
    fileModel->setFilter(QDir::Files);
这样就能使fileModel再次执行过滤。

posted @ 2013-06-08 14:50  云端的思念  阅读(2311)  评论(0编辑  收藏  举报