C
Feb. 12, 2021, 6:35 p.m.

QFileSystemModel проблема с перетаскиванием файлов

c++, qt, windows-application

Здравствуйте!

Я хочу сделать возможность перетаскивание файлов (drag and drop) между QTreeView и QListView. Для этого унаследовал QFileSystemModel и переписал несколько методов.

ExplorerModel.h

  1. #ifndef EXPLORERMODEL_H
  2. #define EXPLORERMODEL_H
  3.  
  4. #include <QObject>
  5. #include <QFileSystemModel>
  6. #include <QMimeData>
  7. #include <QDebug>
  8.  
  9. class ExplorerModel : public QFileSystemModel
  10. {
  11. Q_OBJECT
  12. public:
  13. using QFileSystemModel::QFileSystemModel;
  14. Qt::DropActions supportedDragActions() const;
  15. Qt::DropActions supportedDropActions() const;
  16. QStringList mimeTypes() const;
  17. Qt::ItemFlags flags(const QModelIndex &index) const;
  18. QMimeData *mimeData(const QModelIndexList &indexes) const;
  19. bool dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent);
  20.  
  21. private:
  22. bool canDropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent);
  23. };
  24.  
  25. #endif // EXPLORERMODEL_H

ExplorerModel.cpp

  1. #include "explorermodel.h"
  2.  
  3. Qt::DropActions ExplorerModel::supportedDragActions() const
  4. {
  5. return Qt::CopyAction | Qt::MoveAction;
  6. }
  7.  
  8. Qt::DropActions ExplorerModel::supportedDropActions() const
  9. {
  10. return Qt::CopyAction | Qt::MoveAction;
  11. }
  12.  
  13. Qt::ItemFlags ExplorerModel::flags(const QModelIndex &index) const
  14. {
  15. Qt::ItemFlags defaultFlags = QFileSystemModel::flags(index);
  16.  
  17. if (index.isValid()) {
  18. return Qt::ItemIsDragEnabled | Qt::ItemIsDropEnabled | defaultFlags;
  19. } else {
  20. return Qt::ItemIsDropEnabled | defaultFlags;
  21. }
  22. }
  23.  
  24. QStringList ExplorerModel::mimeTypes() const
  25. {
  26. QStringList types;
  27. types << "application/octet-stream";
  28. return types;
  29. }
  30.  
  31. QMimeData *ExplorerModel::mimeData(const QModelIndexList &indexes) const
  32. {
  33. QMimeData *mimeData = new QMimeData;
  34. QByteArray encodedData;
  35. QDataStream stream(&encodedData, QIODevice::WriteOnly);
  36.  
  37. if (indexes.first().isValid()) {
  38. QString fileName = data(indexes.first(), Qt::DisplayRole).toString();
  39. qDebug() << fileName;
  40. stream << fileName;
  41. }
  42.  
  43. mimeData->setData("application/octet-stream", encodedData);
  44. return mimeData;
  45. }
  46.  
  47. bool ExplorerModel::canDropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent)
  48. {
  49. Q_UNUSED(action);
  50. Q_UNUSED(row);
  51. Q_UNUSED(parent);
  52.  
  53. if (!data->hasFormat("application/octet-stream")) {
  54. return false;
  55. }
  56.  
  57. if (column > 0) {
  58. return false;
  59. }
  60.  
  61. return true;
  62. }
  63.  
  64. bool ExplorerModel::dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent)
  65. {
  66. if (!canDropMimeData(data, action, row, column, parent)) {
  67. return false;
  68. }
  69.  
  70. if (action == Qt::IgnoreAction) {
  71. return true;
  72. }
  73.  
  74. int beginRow;
  75.  
  76. if (row != -1) {
  77. beginRow = row;
  78. } else if (parent.isValid()) {
  79. beginRow = parent.row();
  80. } else {
  81. beginRow = rowCount(QModelIndex());
  82. }
  83.  
  84. QByteArray encodedData = data->data("application/octet-stream");
  85. QDataStream stream(&encodedData, QIODevice::ReadOnly);
  86. QString fileName;
  87.  
  88. while (!stream.atEnd()) {
  89. stream >> fileName;
  90. }
  91.  
  92. //removeRow(row, parent);
  93. insertRow(beginRow, parent);
  94. QModelIndex idx = index(beginRow, 0, QModelIndex());
  95. qDebug() << "Filename: " << fileName;
  96. setData(idx, fileName);
  97. return true;
  98. }

Выводит вот такую ошибку:
Скриншот 1

Ничего не копирует и не переносит. Есть какие-то идеи как исправить эту ошибку? Спасибо.

1
0

Comments

Only authorized users can post comments.
Please, Log in or Sign up
  • Last comments
  • AK
    April 1, 2025, 11:41 a.m.
    Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
  • Evgenii Legotckoi
    March 9, 2025, 9:02 p.m.
    К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…
  • VP
    March 9, 2025, 4:14 p.m.
    Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…
  • ИМ
    Nov. 22, 2024, 9:51 p.m.
    Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
  • Evgenii Legotckoi
    Oct. 31, 2024, 11:37 p.m.
    Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup