I've inspect source code of Qt and it turns out that to fetch source index you should use current selection. So override QTreeview::dropEvent
and fetch current selection by calling selectedIndexes().
Swap is not a problem. You have to just do move twice.
There is spatial method for that: QAbstractItemModel::moveRow (in threes you have only one column so moving row is ok). Here you have a answer with another solutions (for standard item model).
If you have own custom model you have to do it directly on your data and just emit proper signals about moving items.