Nevermind the filter, the problem occurs when setting KDescendantsProxyModel to 
SubTreesWithoutRoots. Using ChildrenOfExactSelection does not produce this 
problem, with or without QSortFilterProxyModel after it. So it is most likely 
an issue in KDescendantsProxyModel.


From: Rodrigo Oliva
Sent: martes, 5 de junio de 2018 18:22
To: 'interest@qt-project.org' <interest@qt-project.org>
Subject: KDescendantsProxyModel + QSortFilterProxyModel issue

Hello, I've been using kde's kitemmodels library to make a content explorer.

I have two panels, the left one which is a QTreeView that shows a folder tree 
structure and the right one which is a QListView that shows a list of files and 
folders from the current selected folder in the left panel, ignoring folder 
structure. The list view can then be filtered with a search box.

Example use case:
Left

-          Folder1

-          Folder2 (selected)

o   Folder3

§  File1
Right

-          Folder3

-          File1

The way I wanted to do this was using the same source model for both panels, 
using proxy models to show whatever I want in each of the panels. The 
kitemmodels lib is great for this.
The structure looks like this (mailing list friendly, indentation marks model 
ancestry):


-          Source Model (modeled as a tree).

o   Left QSortFilterProxyModel

o   KSelectionProxyModel

§  KDescendantsProxyModel - set to SubTreesWithoutRoots

·         Right QSortFilterProxyModel

Everything works great, except when I insert rows in the source model while 
there is an active filter in the right QSortFilterProxyModel, in the 
filterAcceptsRow. It looks like this

bool RightSortFilterProxyModel::filterAcceptsRow(int source_row, const 
QModelIndex& source_parent) const {
                Q_ASSERT(!source_parent.isValid()); // we are filtering a list

                QModelIndex sourceIndex = sourceModel()->index(source_row, 0);
                if (!sourceIndex.isValid()) {
                               return false;
                }

                QString key = sourceModel()->data(sourceIndex).toString();

return filterRegExp().isEmpty() ? true : key.contains(filterRegExp());
}

When sourceModel()->data(sourceIndex) is called, I get an assert in the 
RightSortFilterProxyModel source model, the KDescendantsProxyModel: "Didn't 
find target row.", in its mapToSource function. When run in release, the list 
gets filled with a bunch of empty rows.
The source index is not invalid and sourceModel()->rowCount() returns greater 
than 0.
Am I doing something wrong in this filterAcceptsRow? The strange thing is that 
this works perfectly without the filter.

Excuse me if this not the right mailing list for this, I found some questions 
related to this in qt-interest-old.

Cheers,

Rodrigo
_______________________________________________
Interest mailing list
Interest@qt-project.org
http://lists.qt-project.org/mailman/listinfo/interest

Reply via email to