the overridden data is to store somewhere the level in the original tree before it gets flattened by KDescendantsProxyModel.
I don't believe you need that. Pushing a tree model to a list/table view should give you list/table with the root-level items (speculation again!). In my mind it should be just enough to "move" the root of the model before giving it to the view.
I didn't feel like going through building a QAbstractProxyModel from scratch
Well, yes, I can see why, but if you think about it, most of your methods should turn out trivial (more or less) - similarly to the identity proxy model.