PDA

View Full Version : listing derectory contents



ramamurthy.kv
9th April 2008, 13:38
Hi,

I am new to Qt prgramming but have fair amount of knowledge to work with Qt. I have requirement to list the directry structure of different projects folders like

+ projects
|
+ Qt project
|
+ c:\Qt ## actual directory listing starts here
|
....
+ Qtopia prject
|
+ d:\Qtopia ## actual directory listing starts here
|
....

I know i can use the QDirModel, but that doesnt give the required.

here
1. these derectories are from different drives
2. the first item should always be "projects"
3. the next immediate items will be names of the projects

can anybody help me? expecting piece of code also

thanks in advance
ram

wysota
9th April 2008, 15:12
You can build your own model (or a proxy model) that will return different results depending on the depth - The top most item ("projects") can be hardcoded, the next level would operate on some list of projects and below that you could return data from a proper QDirModel.

ramamurthy.kv
9th April 2008, 16:08
thanks wysota,

yes i thought the same and implemented the first part as to get projects and name of the projects from the list. now the problem is how to integrate this with QDirModel. How can i use the QDirModel for the required path?

if you can elaborate the answer/ piece of code wuld be great

wysota
9th April 2008, 16:24
Have a QDirModel member, map indexes and call the model's implementation of appropriate methods.
Pseudocode follows:

QVariant myModel::data(...){
if( depth(index) >=2){
QModelIndex ind = mapToDirModel(index);
return dirModel->data(ind, role);
} else {
if(!index.parent().isValid()){
if(role==Qt::DisplayRole) return tr("Projects"); else {...}
} else { ... }
}
return QVariant();
}

Probably the hardest part is to make a proper implementation of QAbstractItemModel::parent().

ramamurthy.kv
9th April 2008, 17:09
i cant think of implementing this from beginning. it seems to be beyond my level as am getting into this. i request you to give complete code for similar application if you have any.
thanks

wysota
9th April 2008, 18:15
i request you to give complete code for similar application if you have any.

If I had and I could give it to you, I already would have.

It's not that hard to implement what you want using the dir model, you should really try it. You only have to come up with a nice way to bind "virtual" and "real" paths. It is possible that it is enough to store a file path of the root of the project within the list storing projects.

ramamurthy.kv
1st May 2008, 09:25
Hi,

could you varify my approch and give answers for my questions?

i am using the concept of SimpleTreeModel(example program) to list the top level structure i, e,
+ projects
+ Qt Project
+ d:\qt
+ Qtopia
+ c:\qtopia
now, from "d:\qt" or "c:\qtopia" i would like to use the QDirModel to list the directory structure.
is this valid aproach?
if yes, how to integrate QDirModel with the SimpleTreeModel?

is it possible to use the two model? how?

any low level design details would be great

Thanks

wysota
4th May 2008, 21:46
The approach looks fine. As for combining two models - you'll have to "delegate" access to one model to the other. So for instance if someone asks your model for data for an index that describes a file in a project, you'll have to translate the index to an index understood by the dir model, call the dir model's method with this crafted index and return the result as a result of your method. A simple sketch of what I mean (look in my earlier post for an extended version):

QVariant MyModel::data(const QModelIndex &index, ...) const {
QModelIndex dirIndex = translateToDirModel(index);
return internalDirModel->data(dirIndex, ...);
}

ramamurthy.kv
5th May 2008, 10:45
Thanks Wysota,

I am finding difficult in "mapping the index (of my model) to index of dir model" and also finding the depth of an index. Somehow i managed to code for finding the depth of an index. I have attached the source code. Please verify the depth function and some more hints on mapping the index(i would request the complete code).

As I said earliar, i am using the simpletreemodel code. currently am hardcoded the values in setupModelData.

Thanks

wysota
5th May 2008, 19:59
Finding depth is easy. Just iterate to parent() index and count how many iterations it takes until you reach the top.


QModelIndex iter = index;
int depth = 0;
while(!iter.isNull()){
iter = iter.parent();
++depth;
}