• 534阅读
  • 0回复

[讨论]QFileSystemModel+QTreeView如何让目录树只显示本地磁盘,不显示外部存储设备? [复制链接]

上一主题 下一主题
离线lwei24
 

只看楼主 倒序阅读 楼主  发表于: 2023-05-05
如题,QFileSystemModel+QTreeView如何实现只显示本地磁盘,不显示外部存储设备的目录树。各位大佬们,如下
//frmain.cpp
  1. FrmMain::FrmMain(QWidget *parent) : QMainWindow(parent)
  2. {
  3.     m_pTreeView = new QTreeView(this);
  4.     dir = new QFileSystemModel(this);
  5.     dir->setReadOnly(false);
  6.     dir->setRootPath(QDir::currentPath());
  7.     m_usbModel = new USBDriveFilterProxyModel(this);
  8.     m_usbModel->setSourceModel(dir);
  9.     m_usbModel->setDynamicSortFilter(true);
  10.     m_pTreeView->setModel(m_usbModel);
  11.     m_pTreeView->header()->setStretchLastSection(true);
  12.     m_pTreeView->header()->setSortIndicatorShown(true);
  13.     m_pTreeView->setHeaderHidden(true);
  14.     m_pTreeView->hideColumn(1);
  15.     m_pTreeView->hideColumn(2);
  16.     m_pTreeView->hideColumn(3);
  17.     m_pTreeView->sortByColumn(0, Qt::DescendingOrder);
  18.     m_pTreeView->collapseAll();
  19.     m_pTreeView->resizeColumnToContents(0);
  20.     this->setCentralWidget(m_pTreeView);
  21. }
//usbdrivefilter.cpp
  1. #include "usbdrivefilter.h"
  2. #include <windows.h>
  3. USBDriveFilterProxyModel::USBDriveFilterProxyModel(QObject *parent) :
  4.     QSortFilterProxyModel(parent)
  5. {
  6.     getMountedRemovables();
  7.     // will eventually also register for changes to mounted removables
  8.     // but need to get passed my current issue of not displaying only USBs.
  9. }
  10. bool USBDriveFilterProxyModel::filterAcceptsRow(int sourceRow,
  11.                                                 const QModelIndex &sourceParent) const
  12. {
  13.     QModelIndex index0 = sourceModel()->index(sourceRow, 0, sourceParent);
  14.     // Since drive string can have more than just "<DriveLetter>:", need
  15.     // to check each entry in the usb list for whether it is contained in
  16.     // the current drive string.
  17.     for (int i = 0; i < drivers.size(); i++)
  18.     {
  19.         if (sourceModel()->data(index0).toString().contains(drivers[i]))
  20.         {
  21.             return true;
  22.         }
  23.     }
  24.     return false;
  25. }
  26. void USBDriveFilterProxyModel::getMountedRemovables()
  27. {
  28.     DWORD test = GetLogicalDrives();
  29.     DWORD mask = 1;
  30.     UINT type = 0;
  31.     WCHAR wdrive[] = L"C:\\"; // use as a drive letter template
  32.     for (int i = 0; i < 32; i++)
  33.     {
  34.         if (test & mask)
  35.         {
  36.             wdrive[0] = (char)('A' + i); // change letter in template
  37.             type = GetDriveType(wdrive);
  38.             switch (type) {
  39.             case DRIVE_REMOVABLE:
  40.             {
  41.                 QString qdrive = QString((char)('A' + i)) + ":";
  42.                 removables.append(qdrive);
  43.                 break;
  44.             }
  45.             case DRIVE_FIXED:
  46.             {
  47.                 QString qdrive = QString((char)('A' + i)) + ":";
  48.                 drivers.append(qdrive);
  49.             }
  50.                 break;
  51.             default:
  52.                 break;
  53.             }
  54.         }
  55.         mask = mask << 1;
  56.     }
  57. }
//main.cpp
  1. #include <QApplication>
  2. #include "frmmain.h"
  3. int main(int argc, char **argv)
  4. {
  5.     QApplication app(argc, argv);
  6.     FrmMain w;
  7.     w.resize(500, 500);
  8.     w.show();
  9.     return app.exec();
  10. }
如上代码,为什么虽然你能实现显示本地磁盘,但是点击本地磁盘后,就没有目录树了。各位大佬,有什么拌粉实现只显示本地磁盘,不显示外部存储设备的目录树呢?欢迎大佬们指点一二,小弟在此感激不尽!!



快速回复
限100 字节
 
上一个 下一个