A bit tricky: do emit dataChanged( QModelIndex(), QModelIndex() ); after sorting.
I want to note, that passing invalid indexes is not documented, but I often use it in my projects. It works well and it's much faster than passing valid indexes with big ranges, because cause to update only visible area. But it may have some glitches with heavy delegates / custom widgets.
I tested on QTreeView - updating range of 10k elements takes about 1,5 sec (emitting dataChanged with valid indexes). And when I use invalid indexes signal is processed immideatly.