Hello les gens.
Je bosse sur un éditeur de jeu, et j'ai besoin de préparer un manager d'assets, les assets représentant les fichiers de ressources utilisés par le jeu. (images, sons, ...)
Je me suis fait une classe d'Asset, qui permet de garder le nom de fichier en mémoire et lui lier quelques options supplémentaires, et un assetManager, proposant d'afficher la listes des assets sous forme d'une QTreeView associé à un AssetModel, dérivé de QAbstractItemModel.
Le AssetModel contient des AssetProxy, qui sont simplement des liens vers les Assets existant. Un AssetProxy possède un pointeur vers l'Asset auquel il est lié.
J'ai ajouté une fonction appendRow(AssetProxy *) à mon AssetModel, afin de pouvoir ajouter un nouveau AssetProxy fraichement créé et lié à son Asset.
Ma classe AssetModel se présente comme ça :
Je vous la mets en entier car je vais y revenir pour un autre problème.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35 #pragma once #include <QAbstractItemModel> class AssetProxy; class AssetsModel : public QAbstractItemModel { Q_OBJECT AssetProxy * m_root; public: AssetsModel(QObject * parent = 0); ~AssetsModel(); // Reimplemented QVariant data(const QModelIndex &index, int role) const; Qt::ItemFlags flags(const QModelIndex &index) const; QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const; QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const; QModelIndex parent(const QModelIndex &index) const; int rowCount(const QModelIndex &parent = QModelIndex()) const; int columnCount(const QModelIndex &parent = QModelIndex()) const; virtual Qt::DropActions supportedDropAction() const; Qt::DropActions supportedDragAction() const; bool insertRows(int position, int rows, const QModelIndex &parent = QModelIndex()); bool removeRows(int position, int rows, const QModelIndex &parent = QModelIndex()); void changePersistantIndex(const QModelIndex & from, const QModelIndex & to); void changePersistantIndexList(const QModelIndexList & from, const QModelIndexList & to); void appendRow(AssetProxy * proxy); };
La fonction appendRow est comme ceci :
Et enfin, voila le résultat :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 void AssetsModel::appendRow(AssetProxy * proxy) { int row = m_root->childCount(); beginInsertRows(QModelIndex(), row, row); m_root->appendChild(proxy); endInsertRows(); }
Le but de la fonction appendRow est de mettre les AssetProxy à la suite de la racine de l'arbre, ce qui est fait comme il faut. Là où ça ne va pas, c'est l'embranchement sur le dernier ProxyAsset qui continus comme si un autre Asset était présent à la suite.
J'aurai besoin que quelqu'un m'explique ce qui ne va pas avec mon code et comment je pourrais faire pour corriger la choses.
--------------------------------------------------------------------
La deuxième chose est l'utilisation du Drag & drop. J'aimerais activer le drag & drop pour déplacer les AssetProxy le long de l'arbre.
J'ai regardé le tutoriel de la doc Qt pour le drag & drop des ItemView. Mes AssetProxy sont draggable, mais pas droppable.
J'ai configuré ma vue comme ci :
J'ai aussi surchargé les fonctions supportedDropAction() et supportedDragAction() de mon modèle comme suit :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 m_view = new QTreeView; m_view->setModel(m_model); m_view->header()->setMovable(false); m_view->setSortingEnabled(false); // Drag drop options m_view->setSelectionMode(QAbstractItemView::SingleSelection); m_view->setDragDropMode(QAbstractItemView::InternalMove); m_view->setAcceptDrops(true); m_view->setDragEnabled(true); m_view->setDropIndicatorShown(true);
Ainsi que les flags du model :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 Qt::DropActions AssetsModel::supportedDropAction() const { return Qt::MoveAction; } Qt::DropActions AssetsModel::supportedDragAction() const { return Qt::MoveAction; }
Que me manque-t-il pour rendre le drop accepté?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 Qt::ItemFlags AssetsModel::flags(const QModelIndex &index) const { if(index.isValid() && !static_cast<AssetProxy *>(index.internalPointer())->isFolder()) return Qt::ItemIsDragEnabled | Qt::ItemIsDropEnabled | Qt::ItemIsEnabled | Qt::ItemIsSelectable; else return Qt::ItemIsDragEnabled | Qt::ItemIsEnabled | Qt::ItemIsSelectable; }
Partager