由于项目中需要,需要过滤掉指定某个磁盘,并且要对显示出来的非本地系统盘符过滤掉,只保留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());
}
至此,就可以在界面上看到指定过滤的盘符和只显示的系统盘符了,赶紧尝试下吧。
转载于:https://blog.51cto.com/dreamylights/1585446