使用QT实现平滑的文本动画效果(跑马灯文本效果)

4
我有一个问题,关于如何在不强大的硬件(Atom N270 + Intel 945GSM)上使跑马灯文本流畅(使用Qt 4.5.3)。我的方法如下:
  1. 我将我的文本(36px Arial bold)绘制到QPixmap(离屏绘图设备)上
  2. 我设置一个计时器,在每30ms中向左移动1px的内容。
  3. 当onTimer事件被触发时,我选择QPixmap的一部分并将其打印到窗口画布上。
一般来说,它移动得很平稳。然而,我创建的跑马灯文本越多,CPU使用率就越高。当文本可以填满50%的屏幕(1920x1680)时,CPU使用率约为70-80%。文本动画会有点闪烁。如果我将计时器间隔设置为50ms或更大,则会很平滑。但是文本移动得太慢了。
我的方法是否无效?我应该使用OpenGL吗?欢迎任何提示和提前感谢 ^^)
1个回答

6
您应该查看Graphics View框架。 您可以将QGraphicsTextItem对象添加到QGraphicsScene中,并设置视图的坐标(缩放和平移),使您的文本在出现时移动并呈现任何大小,包括有些文本“超出屏幕”(视图之外)。 我预计这比每个计时器事件复制和绘制QPixmap的(变化大小的)部分要高效得多。
文档说明了Graphics View框架被优化以处理许多对象。 如果发现它并没有更好,您可能需要尝试4.6 beta版。 为Graphics View渲染正在进行优化。
顺便说一下,我建议使用QTimeLine来帮助您驱动动画。 除了提供基本的定时器事件之外,您还可以设置“曲线形状”,可以慢慢加速或减速。只需注意,如果您想在finished()信号后重新启动QTimeLine,并且在调用start()之前未调用setCurrentTime(0),则计时器将以旧持续时间作为当前时间启动。

是的,我首先将其渲染为Pixmap QGraphicsPixmapItems。但我认为QGraphicsTextItem不支持跑马灯文本效果。 - stanleyxu2005
谢谢,如果您稍后能在这里发布一些信息就太好了。我认为我应该使用somewidget.setAttribute(Qt.WM_PaintOnScreen)关闭双缓冲。 - stanleyxu2005
1
结果发现必须在QGraphicsPixmapItem上调用setTransformationMode(Qt::SmoothTransformation)才能应用平滑处理。在视图上调用setRenderHints似乎没有效果(至少在X11上),尽管QGraphicsPixmapItem的文档说转换质量取决于视口。我认为,质量并不是很好。希望能更好地控制可用的抗锯齿滤镜类型。 - Patrick
我已经找到了问题所在。我使用了计时器来控制跑马灯文本的移动。然而,当进行绘图操作时,计时器将不会被暂停。现在,我在绘图过程中停止计时器,并在绘图结束后恢复它。现在看起来好多了。 - stanleyxu2005
似乎QGraphicsPixmapItem :: setTransformationMode(Qt :: SmoothTransformation)比默认模式(Qt :: FastTransformation)效果更好。但是,在缩放小部件时仍然存在走样现象。我将尝试使用在https://stackoverflow.com/a/30069428/692223下提到的QGraphicsSvgItem。稍后会分享结果。 - Steve
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接