由於項目中需要,需要過濾掉指定某個磁盤,並且要對顯示出來的非本地系統盤符過濾掉,只保留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()); }
至此,就可以在界面上看到指定過濾的盤符和只顯示的系統盤符了,趕緊嘗試下吧。