Solved Cycling through the items of TreeModel
-
I need to cycle through the items of a TreeModel.
Example:Root
|_anItem
|_anotherItem
|_aChild
|_anotherChild
|_andSoOnAnd I need to browse through them a bit like this:
anItem ; anotherItem ; aChild ; anotherChild ; andSoOn
Is there an iterator going through all the items or do I have to write a kind of "++" operator doing the tests (child is valid and so on)?I'm writing something like that:
void itemIndexPlusPlus(QModelIndex &index){ int indexRowBuf; if (index.child(0,0).isValid())//if has child index = index.child(0,0); else if (index.parent().child(index.row()+1, 0).isValid())//if has buddy following index = index.parent().child(index.row()+1, 0); else { while ((index != rootIndex())) {//ascend to the master excepted if children of row+1 indexRowBuf = index.row(); index = index.parent(); if (index.child(indexRowBuf + 1, 0).isValid()) { index = index.child(indexRowBuf + 1, 0); break; } } } }
But first it's not very stylish : long code and plenty of tests for something simple and then, I don't like to reinvent the wheel. Qt has plenty of wheels, but I sometimes have difficulties to find the good one...
Patrick.
-
How about recursion? for example:
void printModel(const QAbstractItemModel* const model, const QModelIndex& parent = QModelIndex()) { const int rowCount = model->rowCount(parent); if(model->columnCount(parent) == 0) { return; } for(int i = 0; i < rowCount; ++i) { const QModelIndex currIdx = model->index(i, 0, parent); qDebug() << currIdx.data(); if(model->hasChildren(currIdx)) { printModel(model, currIdx); } } } // printModel
then call it with
printModel(treeModel);
-
It seems to work.
Recursion was an old souvenir in my studies...
Thanks to you, you contributed to my programmer experience :)
-
One question : why are all the arguments const ?
-
It's the most permissive way. with all those consts you can call the function with arguments of any constness. for example:
QAbstractItemModel* model; printModel(treeModel); //works const QAbstractItemModel* model; printModel(treeModel); //works QAbstractItemModel* const model; printModel(treeModel); //works const QAbstractItemModel* const model; printModel(treeModel); //works
Of course I could do that because all I do in that function is print values from model to the console. if you want to change values in the model you have to lose the first
const
so:void printModel(QAbstractItemModel* const model, const QModelIndex& parent = QModelIndex())
but now if you try to call it with a const model (const QAbstractItemModel* model; printModel(treeModel);
) it will fail to compile