Я сделал это так (PyQt4):
После инициализации я подключаюсь к событию полосы прокрутки:
self.tableView.verticalScrollBar().valueChanged.connect(self.onScroll)
Тогда в обработчике:
def onScroll(self, *args):
"Ensure that selected row moves when scrolling - it must be always visible."
tableView = self.tableView
currentRow = tableView.selectionModel().currentIndex().row()
rect = tableView.viewport().rect()
topRow = tableView.indexAt(rect.topLeft()).row()
if currentRow < topRow:
tableView.selectRow(topRow)
else:
bottomRow = tableView.indexAt(rect.bottomLeft()).row()
if currentRow > bottomRow:
tableView.selectRow(bottomRow)