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());
}


至此,就可以在界面上看到指定過濾的盤符和只顯示的系統盤符了,趕緊嘗試下吧。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章