由于项目中需要,需要过滤掉指定某个磁盘,并且要对显示出来的非本地系统盘符过滤掉,只保留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-----" <
<< "FileSystemName format type----"<

在获得了各个磁盘的盘符后,就要过滤掉非系统盘符,用QList存放系统盘符,因为非系统盘可能有多个。

QList
 CUtilityMethods::GetDriveDetail(){    qDebug()<<"all get drive here";    //QStringList drivesType;    QList
 drivesType;    foreach( QFileInfo drive, QDir::drives() )    {        qDebug()<<"--------------------------------";        QString tdrv=drive.absolutePath();        qDebug()<<"path----"<

在保存非系统盘符后,就需要在界面上显示出来,我们使用QSortFilterProxyModel这种过滤模型,主要重写里面的filterAcceptsRow方法。

MySortFilterProxyModel::MySortFilterProxyModel(QObject *parent)    : QSortFilterProxyModel(parent){    // 获取磁盘信息    QList
 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
 i(m_storeDriveName);    while (i.hasNext()) {        if (index.data().toString() == i.next().value())        {            return false;        }    }    return sourceModel()->data(index).toString().contains(filterRegExp());}

至此,就可以在界面上看到指定过滤的盘符和只显示的系统盘符了,赶紧尝试下吧。