Bonjour à tous
J'ai un peu de mal à comprendre comment QTreeView parcourt les QAbstractItemModel et quelles fonctions il appelle.
Pour tester, j'ai créé une simple classe héritant de QAbstractItemModel et qui contient un arbre (codé à la main, dans un QStandardItemModel). Ma classe ne fait qu'appeler la fonction du QStandardItemModel. Par exemple, pour data() :
J'ai surchargé les fonctions qui doivent l'être normalement :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 QVariant TableToTreeProxyModel::data(const QModelIndex &index, int role) const { return sourceModel()->data(index, role); }
J'ai également affiché mon arbre avec une simple fonction récursive qui utilise les fonction data(), hasChildren(), rowCount() et index() :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const; QModelIndex parent(const QModelIndex &child) const; QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const; int rowCount(const QModelIndex &parent) const; int columnCount(const QModelIndex &parent) const; Qt::ItemFlags flags(const QModelIndex &index) const;
Par contre, quand j'essaie d'afficher mon arbre dans un QTreeView, rien de s'affiche (alors que le QStandardItemModel s'affiche correctement).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 void drawTree(QAbstractItemModel* tree, QModelIndex const& parent, int level) { QString s = ""; QString t = s.rightJustified(level*2, ' '); qDebug() << t + tree->data(parent).toString(); if (tree->hasChildren(parent)) { for (int row = 0; row < tree->rowCount(parent); ++row ) { drawTree(tree, tree->index(row, 0, parent), level+1); } } }
Des idées ?
Merci
PS : j'ai également essayé d'utiliser un QAbstractProxyModel sans succès alors qu'un QSortFilterProxyModel fonctionne.
Partager