Calling removeRow() from within a proxy causes the call to be forwarded to the source model and I doubt this is what you want. Why don't you do what I suggested - calculate the visibility of the whole tree and cache it in the proxy so that all you do within filterAcceptsRow() and family is return the cached value.