15,629
社区成员




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