Я ошибся сказав, что использовал centerOn.
Вот работающий код:
Некоторые поправки:
1. В mousePressEvent() вставить проверку:
C++ (Qt)
if( verticalScrollBar()->isVisible() || horizontalScrollBar()->isVisible() ) ...
2. Зачем в mouseMoveEvent() использовать довольно-таки тяжелый translate(), когда можно просто двигать вьюпорт так:
C++ (Qt)
horizontalScrollBar()->setValue( horizontalScrollBar()->value() + (...) );
verticalScrollBar()->setValue( verticalScrollBar()->value() + (...) );
3. Наверное в mousePressEvent() и mouseReleaseEvent() нужно не игнорировать событие, а вызывать соответствующий метод базового класса.