在我的一个项目中,我希望有一个自动滚动的文本框。
我不是在谈论每当有人添加文字行时滚动的文本框,而是某个类似电影"closing credits"序列的文本框。
文本框将使用文本进行完整填充,并在没有任何用户操作的情况下缓慢向下滚动。
是否有适合此目的的现有小部件?如果没有,那么实现这一目标的最佳方式是什么?
答案 0 :(得分:2)
如果你想要一些奇特的东西,我认为GraphicsView方法是最灵活的方法。
更简单的方法可能是使用“动画框架”,设置QPropertyAnimation并将其连接到QTextBrowser的垂直滚动条的“value”属性。 (看一下动画框架示例)。
答案 1 :(得分:1)
使用QGraphicsView,QGraphicsScene和QGraphicsTextItem。使用QGraphicsTextItem,您可以使用html很好地格式化滚动文本。然后启动一个计时器来移动QGraphicsTextItem。
答案 2 :(得分:1)
Roku建议使用QGraphicsView是一个很好的建议,但如果您正在寻找复杂的文本渲染,您可能不希望使用QGraphicsView。
另一种方法是使用QTextDocument的渲染功能(àlaQAbstractTextDocumentLayout)来绘制感兴趣的文本区域。滚动就是调用update()来呈现文本区域的新部分。
这是一些Python(PyQt),它代表了你需要做的绘图部分:
# 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()