QFileSystemModel+QTreeView如何让目录树只显示本地磁盘,不显示外部存储设备?

lwei2 lwei2 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区

如题,QFileSystemModel+QTreeView如何实现只显示本地磁盘,不显示外部存储设备的目录树。各位大佬们,具体代码如下
 

FrmMain::FrmMain(QWidget *parent) : QMainWindow(parent)
{
    m_pTreeView = new QTreeView(this);
    dir = new QFileSystemModel(this);
    dir->setReadOnly(false);
    dir->setRootPath(QDir::currentPath());
    m_usbModel = new USBDriveFilterProxyModel(this);
    m_usbModel->setSourceModel(dir);
    m_usbModel->setDynamicSortFilter(true);
    m_pTreeView->setModel(m_usbModel);
    m_pTreeView->header()->setStretchLastSection(true);
    m_pTreeView->header()->setSortIndicatorShown(true);
    m_pTreeView->setHeaderHidden(true);
    m_pTreeView->hideColumn(1);
    m_pTreeView->hideColumn(2);
    m_pTreeView->hideColumn(3);
    m_pTreeView->sortByColumn(0, Qt::DescendingOrder);
    m_pTreeView->collapseAll();
    m_pTreeView->resizeColumnToContents(0);
    this->setCentralWidget(m_pTreeView);
}


#include "usbdrivefilter.h"
#include <windows.h>
USBDriveFilterProxyModel::USBDriveFilterProxyModel(QObject *parent) :
    QSortFilterProxyModel(parent)
{
    getMountedRemovables();
    // will eventually also register for changes to mounted removables
    // but need to get passed my current issue of not displaying only USBs.
}
bool USBDriveFilterProxyModel::filterAcceptsRow(int sourceRow,
                                                const QModelIndex &sourceParent) const
{
    QModelIndex index0 = sourceModel()->index(sourceRow, 0, sourceParent);
    // Since drive string can have more than just "<DriveLetter>:", need
    // to check each entry in the usb list for whether it is contained in
    // the current drive string.
    for (int i = 0; i < drivers.size(); i++)
    {
        if (sourceModel()->data(index0).toString().contains(drivers[i]))
        {
            return true;
        }
    }
    return false;
}
void USBDriveFilterProxyModel::getMountedRemovables()
{
    DWORD test = GetLogicalDrives();
    DWORD mask = 1;
    UINT type = 0;
    WCHAR wdrive[] = L"C:\\"; // use as a drive letter template
    for (int i = 0; i < 32; i++)
    {
        if (test & mask)
        {
            wdrive[0] = (char)('A' + i); // change letter in template
            type = GetDriveType(wdrive);
            switch (type) {
            case DRIVE_REMOVABLE:
            {
                QString qdrive = QString((char)('A' + i)) + ":";
                removables.append(qdrive);
                break;
            }
            case DRIVE_FIXED:
            {
                QString qdrive = QString((char)('A' + i)) + ":";
                drivers.append(qdrive);
            }
                break;
            default:
                break;
            }
        }
        mask = mask << 1;
    }
}

#include <QApplication>
#include "frmmain.h"
int main(int argc, char **argv)
{
    QApplication app(argc, argv);
    FrmMain w;
    w.resize(500, 500);
    w.show();
    return app.exec();
}


 

...全文

相关推荐

评论
收藏 已收藏
分享
返回顶部
lwei2
Qt 21,503 成员 26,693 内容