首页 > 代码库 > QDirModel使用QSortFilterProxyModel过滤指定磁盘和非系统盘
QDirModel使用QSortFilterProxyModel过滤指定磁盘和非系统盘
由于项目中需要,需要过滤掉指定某个磁盘,并且要对显示出来的非本地系统盘符过滤掉,只保留CDEF等盘符。网上没有可供参考的资料,折腾了很久,终于搞定了,现在写下来以供后人借鉴。
一、过滤指定磁盘
过滤指定磁磁盘,我们可以通过QSortFilterProxyModel自带的setFilterRegExp过滤。
proxyModel = new MySortFilterProxyModel; model = new RewriteQDirModel(this); proxyModel->setSourceModel(model); proxyModel->setFilterRegExp("[^C:c:].*"); treeView = new QTreeView; treeView->setModel(proxyModel);
二、过滤非系统盘符
首先,需要获得各个磁盘卷名。
QString CUtilityMethods::TvInfo(QString & tdrive) { WCHAR szVolumeName[256] ; WCHAR szFileSystemName[256]; DWORD dwSerialNumber = 0; DWORD dwMaxFileNameLength=256; DWORD dwFileSystemFlags=0; qDebug()<< "get bool return-----" <<GetVolumeInformation( (WCHAR *) tdrive.utf16(),szVolumeName,256,&dwSerialNumber,&dwMaxFileNameLength,&dwFileSystemFlags,szFileSystemName,256); qDebug()<< "FileSystemName format type----"<<QString::fromUtf16 ( (const ushort *) szFileSystemName) ; QString fileSystemName = QString::fromUtf16 ( (const ushort *) szFileSystemName) ; return fileSystemName; }
在获得了各个磁盘的盘符后,就要过滤掉非系统盘符,用QList存放系统盘符,因为非系统盘可能有多个。
QList<QString> CUtilityMethods::GetDriveDetail() { qDebug()<<"all get drive here////////////////////////////////////////////////////"; //QStringList drivesType; QList<QString> drivesType; foreach( QFileInfo drive, QDir::drives() ) { qDebug()<<"--------------------------------"; QString tdrv=drive.absolutePath(); qDebug()<<"path----"<<tdrv ; QString volume_name = TvInfo(tdrv); if (volume_name != "NTFS") { QString driveType = tdrv.mid(0,2); if(!drivesType.contains(driveType)) { drivesType.append(driveType); } } } return drivesType; }
在保存非系统盘符后,就需要在界面上显示出来,我们使用QSortFilterProxyModel这种过滤模型,主要重写里面的filterAcceptsRow方法。
MySortFilterProxyModel::MySortFilterProxyModel(QObject *parent) : QSortFilterProxyModel(parent) { // 获取磁盘信息 QList<QString> drivesType = CUtilityMethods::GetDriveDetail(); if(drivesType.isEmpty()) return; for (int i = 0; i < drivesType.size(); ++i) { driveType = drivesType.at(i).toLocal8Bit().constData(); qDebug() << "driveType" << driveType; m_storeDriveName.insert(i, driveType); } } MySortFilterProxyModel::~MySortFilterProxyModel(void) { } // 过滤掉CD磁盘驱动器,只保留NTFS本地磁盘 bool MySortFilterProxyModel::filterAcceptsRow( int source_row, const QModelIndex &source_parent ) const { if (!sourceModel()) { return false; } QModelIndex index = sourceModel()->index(source_row,0,source_parent); QMapIterator<int, QString> i(m_storeDriveName); while (i.hasNext()) { if (index.data().toString() == i.next().value()) { return false; } } return sourceModel()->data(index).toString().contains(filterRegExp()); }
至此,就可以在界面上看到指定过滤的盘符和只显示的系统盘符了,赶紧尝试下吧。
本文出自 “大白菜” 博客,请务必保留此出处http://dreamylights.blog.51cto.com/1163218/1585446
QDirModel使用QSortFilterProxyModel过滤指定磁盘和非系统盘
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。