Roku's suggestion to use QGraphicsView is a good one, but in the event that you're looking for complex text rendering, you may not wish to use QGraphicsView.
Another way to do it is to use QTextDocument's rendering capabilities (à la QAbstractTextDocumentLayout) in order to draw the text region of interest. Scrolling is then simply a matter of calling update() to render a new portion of the text region.
Here's some Python (PyQt) that represents the drawing portion of what you need to do:
# stored within your widget
doc = QTextDocument(self)
doc.setHtml(yourText) # set your text
doc.setTextWidth(self.width()) # as wide as your current widget
ctx = QAbstractTextDocumentLayout.PaintContext()
dl = doc.documentLayout()
# and within your paint event
painter.save()
# you're probably going to draw over the entire widget, but if not
# painter.translate(areaInWhichToDrawRect);
painter.setClipRect(areaInWhichToDrawRect.translated(-areaInWhichToDrawRect.topLeft()))
# by changing the drawing area for each update you emulate scrolling
ctx.clip = theNextAreaToDraw()
dl.draw(painter, ctx)
painter.restore()