QSortFilterProxyModel
-
I have a Qtreeview displaying a custom QSortFilterProxyModel based on the QFileSystemModel. I need to filter out rows within my root directory. What can I use to filter only files within the rootdirectory that I set (QModelIndex? cast my sourcemodel to QFileSystemModel and compare file name?)? What would be the ideal way to implement this?
-
I think that is the only option.
You could also compare the parent model index with the root model index, but no way around casting the source model. -
No need for casts, I think. Why not just make the role to apply the filter on a property of the QSFPM?
-
And which property should be used?
Do you mean: use data() with a specific column? there you don't get the full path, right? So how to check thge parent directory of an element? -
Sure you have! See the QFileSystemModel::Roles enum.
Using the right role, you have the full path of every item in the model directly from that item. -
Andre, can you provide code snippet? Let's say I have the following directory and I wanted a filter to do the folders below:
@
TestSuite <--- Root Directory
-- common <--- need to filter this folder
-- tools <--- need to filter this folder
-- test1 <--- keep this folder
-- test2 <--- keep this folder
L cfg <--- need to filter this subfolder
L testa <--- keep this subfolder
L testb <--- keep this subfolder
@Basically the logic for my filter will be 1.) Child of root directory and 2) Subdirectory folder must start with test.
-
I could, but I won't, sorry. You learn nothing of just copy/pasting snippets from others. The idea is that you will have to do it, so that you learn. What have you tried so far?
-
Andre, I was not trying to copy your source by any means. I was hoping your example can help answer some of things I am unsure how to implement efficiently. The following is what I currently have:
@
bool CheckableProxyModel::filterAcceptsRow ( int source_row, const QModelIndex & source_parent ) const
{
QModelIndex index0 = sourceModel()->index(source_row, COL_FILE_NAME, source_parent);
QString str = ((QFileSystemModel)sourceModel()).fileName(index0);qDebug() << "filterAcceptsRow 0: " << str; if (str == "/") return true; str = ((QFileSystemModel)sourceModel()).filePath(index0); if (str.contains(root)) { qDebug() << "filterAcceptsRow 1: " << str; str = str.remove(0, root.length()); qDebug() << "filterAcceptsRow 2: " << str; if (str == "" || str.startsWith("test_")) return true; } return false;
}
@Can you help clarify the following:
1.) I am currently using a fixed string for my root directory comparison. Is there a way for me to retrieve it from my source model?
2.) How do I iterate through the subdirectories for line 21 and filter out the rows that starts with "test_"You help is greatly appreciated!
-
Andre, I got things to work like I wanted. However, what is the best way for me to determine my source model root directory? Do I have to set it manually or can I determine it from my source model?