Advertisement
bmahf

QFileSystemModel/QSortFilterProxyModel crash issue

Dec 9th, 2014
366
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 11.08 KB | None | 0 0
  1. filesystemusbmodeldialog.h
  2. ---------------------------------------------------------------------------
  3.  
  4. #include "ui_filesystemusbmodelwidget.h"
  5.  
  6. #include <QWidget>
  7. #include <QFileSystemModel>
  8. #include <QItemDelegate>
  9.  
  10. class USBDriveFilterProxyModel;
  11.  
  12. class IconItemUsbDelegate : public QItemDelegate
  13. {
  14. public:
  15.     IconItemUsbDelegate();
  16.     QSize sizeHint ( const QStyleOptionViewItem & option, const QModelIndex & index ) const;
  17. };
  18.  
  19. class IconFileSystemUsbModel : public QFileSystemModel
  20. {
  21.     Q_OBJECT
  22. public:
  23.     virtual QVariant data ( const QModelIndex & index, int role = Qt::DisplayRole ) const;
  24.  
  25. };
  26.  
  27. class FileSystemUsbModelDialog : public QWidget
  28. {
  29.     Q_OBJECT
  30.  
  31. public:
  32.     explicit FileSystemUsbModelDialog(QWidget *parent);
  33.     ~FileSystemUsbModelDialog();
  34.  
  35. private:
  36.     Ui::FileSystemUsbModelWidget *ui;
  37.     IconFileSystemUsbModel *dir;
  38.     USBDriveFilterProxyModel *usbModel;
  39.  
  40. Q_SIGNALS:
  41.     void signalFileSelected(QString);
  42. };
  43.  
  44. #endif // FILESYSTEMUSBMODELDIALOG_H
  45. ---------------------------------------------------------------------------
  46.  
  47.  
  48. filesystemusbmodeldialog.cpp:
  49. ---------------------------------------------------------------------------
  50. #include "filesystemusbmodeldialog.h"
  51. #include "usbdrivefilter.h"
  52.  
  53. IconItemUsbDelegate::IconItemUsbDelegate(){}
  54.  
  55. QSize IconItemUsbDelegate::sizeHint ( const QStyleOptionViewItem & /*option*/, const QModelIndex & index ) const
  56. {
  57.     // original method
  58.     const QFileSystemModel *model = reinterpret_cast<const QFileSystemModel *>(index.model());
  59.     QFileInfo info = model->fileInfo(index);
  60.     if(info.isDir())
  61.     {
  62.         return QSize(40,40);
  63.     }
  64.     else
  65.     {
  66.         return QSize(64,64);
  67.     }
  68.  
  69. //    // casting to proxy model then getting source model cast to QFileSystemModel
  70. //    const USBDriveFilterProxyModel *proxymodel = reinterpret_cast<const USBDriveFilterProxyModel *>(index.model());
  71. //    const QFileSystemModel *fsmodel = reinterpret_cast<const QFileSystemModel *>(proxymodel->sourceModel());
  72. //    QFileInfo fsinfo = fsmodel->fileInfo(index);
  73. //    if(fsinfo.isDir())
  74. //    {
  75. //        return QSize(40,40);
  76. //    }
  77. //    else
  78. //    {
  79. //        return QSize(64,64);
  80. //    }
  81.  
  82. //    // no body, but just returning the same QSize every time.
  83. //    return QSize(40,40);
  84. }
  85.  
  86. QVariant IconFileSystemUsbModel::data ( const QModelIndex & index, int role ) const
  87. {
  88.     // will do more, but for now, just paints to view
  89.     return QFileSystemModel::data(index, role);
  90. }
  91.  
  92. FileSystemUsbModelDialog::FileSystemUsbModelDialog(QWidget *parent) :
  93.     QWidget(parent),
  94.     ui(new Ui::FileSystemUsbModelWidget)
  95. {
  96.     ui->setupUi(this);
  97.  
  98.     dir = new IconFileSystemUsbModel();
  99.     dir->setRootPath("\\");
  100.     dir->setFilter(QDir::AllDirs | QDir::NoDotAndDotDot);
  101.  
  102.     usbModel = new USBDriveFilterProxyModel(this);
  103.     usbModel->setSourceModel(dir);
  104.     usbModel->setDynamicSortFilter(false);
  105.  
  106.     IconItemUsbDelegate *iconItemDelegate = new IconItemUsbDelegate();
  107.  
  108.     ui->treeView->setRootIsDecorated(false); // added
  109.     ui->treeView->setModel(usbModel);
  110.     ui->treeView->setSortingEnabled(true); // added
  111.     //ui->treeView->setModel(dir); // changing to passing just the IconFileSystemUsbModel object works fine!!
  112.     // hide unneeded hierachy info columns
  113.     ui->treeView->hideColumn(1);
  114.     ui->treeView->hideColumn(2);
  115.     ui->treeView->hideColumn(3);
  116.     ui->treeView->setItemDelegate(iconItemDelegate);
  117. }
  118.  
  119. FileSystemUsbModelDialog::~FileSystemUsbModelDialog()
  120. {
  121.     delete dir;
  122. }
  123. ---------------------------------------------------------------------------
  124.  
  125. usbdrivefilter.h
  126. ---------------------------------------------------------------------------
  127.  
  128. #ifndef USBDRIVEFILTER_H
  129. #define USBDRIVEFILTER_H
  130.  
  131. #include <QSortFilterProxyModel>
  132. #include <QModelIndex>
  133. #include <QString>
  134.  
  135. class USBDriveFilterProxyModel : public QSortFilterProxyModel
  136. {
  137.     Q_OBJECT
  138. public:
  139.     explicit USBDriveFilterProxyModel(QObject *parent = 0);
  140.  
  141. protected:
  142.     virtual bool filterAcceptsRow(
  143.         int source_row, const QModelIndex &source_parent) const;
  144.  
  145. private:
  146.     void getMountedRemovables();
  147.  
  148. private:
  149.     QList<QString> removables;
  150.  
  151. };
  152.  
  153. #endif // USBDRIVEFILTER_H
  154. ---------------------------------------------------------------------------
  155.  
  156. usbdrivefilter.cpp
  157. ---------------------------------------------------------------------------
  158. #include "usbdrivefilter.h"
  159.  
  160. #include <windows.h>
  161.  
  162. USBDriveFilterProxyModel::USBDriveFilterProxyModel(QObject *parent) :
  163.     QSortFilterProxyModel(parent)
  164. {
  165.     getMountedRemovables();
  166.     // will eventually also register for changes to mounted removables
  167.     // but need to get passed my current issue of not displaying only USBs.
  168. }
  169.  
  170. bool USBDriveFilterProxyModel::filterAcceptsRow(int sourceRow,
  171.     const QModelIndex &sourceParent) const
  172. {
  173.     QModelIndex index0 = sourceModel()->index(sourceRow, 0, sourceParent);
  174.  
  175.     // Since drive string can have more than just "<DriveLetter>:", need
  176.     // to check each entry in the usb list for whether it is contained in
  177.     // the current drive string.
  178.  
  179.     QString source = sourceModel()->data(index0).toString();
  180.     for (int i = 0; i < removables.size(); i++)
  181.     {
  182.         if (source.contains(removables[i]))
  183.         {
  184.             return true;
  185.         }
  186.     }
  187.     return false;
  188. }
  189.  
  190. void USBDriveFilterProxyModel::getMountedRemovables()
  191. {
  192.     DWORD test = GetLogicalDrives();
  193.  
  194.     DWORD mask = 1;
  195.     UINT type = 0;
  196.     WCHAR wdrive[] = L"C:\\"; // use as a drive letter template
  197.     for (int i = 0; i < 32; i++)
  198.     {
  199.         if (test & mask)
  200.         {
  201.             wdrive[0] = (char)('A' + i); // change letter in template
  202.             type = GetDriveType(wdrive);
  203.             switch (type) {
  204.             case DRIVE_REMOVABLE:
  205.             {
  206.                 QString qdrive = QString((char)('A' + i)) + ":";
  207.                 removables.append(qdrive);
  208.                 break;
  209.             }
  210.             default: break;
  211.             }
  212.         }
  213.         mask = mask << 1;
  214.     }
  215. }
  216. ---------------------------------------------------------------------------
  217.  
  218. mainwindow.h
  219. ---------------------------------------------------------------------------
  220. #ifndef MAINWINDOW_H
  221. #define MAINWINDOW_H
  222.  
  223. #include <QMainWindow>
  224.  
  225. class FileSystemUsbModelDialog;
  226. class QFileSystemModel;
  227.  
  228. namespace Ui {
  229. class MainWindow;
  230. }
  231.  
  232. class MainWindow : public QMainWindow
  233. {
  234.     Q_OBJECT
  235.  
  236. public:
  237.     explicit MainWindow(QWidget *parent = 0);
  238.     ~MainWindow();
  239.  
  240. private:
  241.     Ui::MainWindow *ui;
  242.     FileSystemUsbModelDialog *treeView;
  243.     QFileSystemModel *fileSystemModel;
  244. };
  245.  
  246. #endif // MAINWINDOW_H
  247. ---------------------------------------------------------------------------
  248.  
  249. mainwindow.cpp
  250. ---------------------------------------------------------------------------
  251. #include "mainwindow.h"
  252. #include "ui_mainwindow.h"
  253. #include "filesystemusbmodeldialog.h"
  254.  
  255. #include <QFileSystemModel>
  256.  
  257. MainWindow::MainWindow(QWidget *parent) :
  258.     QMainWindow(parent),
  259.     ui(new Ui::MainWindow)
  260. {
  261.     ui->setupUi(this);
  262.  
  263.     treeView = new FileSystemUsbModelDialog(this);
  264.     setCentralWidget(treeView);
  265.     fileSystemModel = new QFileSystemModel;
  266. }
  267.  
  268. MainWindow::~MainWindow()
  269. {
  270.     delete ui;
  271. }
  272. ---------------------------------------------------------------------------
  273.  
  274. ui_filesystemusbmodelwidget.h
  275. ---------------------------------------------------------------------------
  276. /********************************************************************************
  277. ** Form generated from reading UI file 'filesystemmodelwidget.ui'
  278. **
  279. ** Created by: Qt User Interface Compiler version 5.1.1
  280. **
  281. ** WARNING! All changes made in this file will be lost when recompiling UI file!
  282. ********************************************************************************/
  283.  
  284. #ifndef UI_FILESYSTEMUSBMODELWIDGET_H
  285. #define UI_FILESYSTEMUSBMODELWIDGET_H
  286.  
  287. #include <QtWidgets/QApplication>
  288. #include <QtWidgets/QHeaderView>
  289. #include <QtWidgets/QTreeView>
  290.  
  291. QT_BEGIN_NAMESPACE
  292.  
  293. class Ui_FileSystemUsbModelWidget
  294. {
  295. public:
  296.     QTreeView *treeView;
  297.  
  298.     void setupUi(QWidget *FileSystemUsbModelWidget)
  299.     {
  300.         if (FileSystemUsbModelWidget->objectName().isEmpty())
  301.             FileSystemUsbModelWidget->setObjectName(QStringLiteral("FileSystemUsbModelWidget"));
  302.         FileSystemUsbModelWidget->resize(670, 755);
  303.         treeView = new QTreeView(FileSystemUsbModelWidget);
  304.         treeView->setGeometry(QRect(0, 0, 670, 531));
  305.         treeView->setObjectName(QStringLiteral("treeView"));
  306.         treeView->setAutoFillBackground(true);
  307.         treeView->setStyleSheet(QLatin1String(" QScrollBar:vertical {\n"
  308. "      width: 61px;\n"
  309. "       background-color: rgb(227, 227, 227);\n"
  310. "  }\n"
  311. "  QScrollBar::handle:vertical {\n"
  312. "      min-height: 50px;\n"
  313. "  }\n"
  314. "\n"
  315. "QTreeView, QListView {\n"
  316. "       alternate-background-color: rgb(226, 226, 226);\n"
  317. "       font-size: 16px;\n"
  318. "     show-decoration-selected: 1;\n"
  319. " }\n"
  320. "\n"
  321. " QTreeView::item, QListView::item {\n"
  322. " height: 22px;\n"
  323. "      border: 1px solid transparent;\n"
  324. "     border-top-color: transparent;\n"
  325. "     border-bottom-color: transparent;\n"
  326. " }\n"
  327. "\n"
  328. " QTreeView::item:selected, QListView::item::selected {\n"
  329. "     border: 1px solid #567dbc;\n"
  330. "       background-color: rgb(85, 170, 255);\n"
  331. " }\n"
  332. "\n"
  333. "\n"
  334. " QTreeView::branch:has-siblings:!adjoins-item {\n"
  335. "     border-image: url(:/new/prefix1/images/vline.png) 0;\n"
  336. " }\n"
  337. "\n"
  338. " QTreeView::branch:has-siblings:adjoins-item {\n"
  339. "     border-image: url(:/new/prefix1/images/branch-more.png) 0;\n"
  340. " }\n"
  341. "\n"
  342. " QTreeView::branch:!has-children:!has-siblings:adjoins-item {\n"
  343. "     border-image: url"
  344.                         "(:/new/prefix1/images/branch-end.png) 0;\n"
  345. " }\n"
  346. "\n"
  347. " QTreeView::branch:has-children:!has-siblings:closed,\n"
  348. " QTreeView::branch:closed:has-children:has-siblings {\n"
  349. "         border-image: none;\n"
  350. "         image: url(:/new/prefix1/images/branch-closed.png);\n"
  351. " }\n"
  352. "\n"
  353. " QTreeView::branch:open:has-children:!has-siblings,\n"
  354. " QTreeView::branch:open:has-children:has-siblings  {\n"
  355. "         border-image: none;\n"
  356. "         image: url(:/new/prefix1/images/branch-open.png);\n"
  357. " }\n"
  358. ""));
  359.         treeView->setFrameShape(QFrame::Box);
  360.         treeView->setFrameShadow(QFrame::Plain);
  361.         treeView->setHorizontalScrollMode(QAbstractItemView::ScrollPerItem);
  362.         treeView->setExpandsOnDoubleClick(true);
  363.         treeView->header()->setVisible(false);
  364.         treeView->header()->setStretchLastSection(true);
  365.  
  366.         retranslateUi(FileSystemUsbModelWidget);
  367.  
  368.         QMetaObject::connectSlotsByName(FileSystemUsbModelWidget);
  369.     } // setupUi
  370.  
  371.     void retranslateUi(QWidget *FileSystemUsbModelWidget)
  372.     {
  373.         FileSystemUsbModelWidget->setWindowTitle(QApplication::translate("FileSystemUsbModelWidget", "Form", 0));
  374.     } // retranslateUi
  375.  
  376. };
  377.  
  378. namespace Ui {
  379.     class FileSystemUsbModelWidget: public Ui_FileSystemUsbModelWidget {};
  380. } // namespace Ui
  381.  
  382. QT_END_NAMESPACE
  383.  
  384. #endif // UI_FILESYSTEMMODELWIDGET_H
  385. ---------------------------------------------------------------------------
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement