[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再次执行过滤。