我正在开发一个基于 Qt 的应用程序(实际上是在 PyQt 中,但我认为这与这里无关),其中一部分涉及将潜在的连续数据流实时绘制到图形上。
我通过创建一个派生的类来实现这一点,该类QWidget
缓冲传入的数据,并每 30 毫秒绘制一次图形(默认情况下)。在__init__()
中,aQPixmap
被创建,并且在 a 的每个刻度上QTimer
,(1)图形向左移动新数据将占用的像素数,(2)在空间中绘制的矩形,(3)绘制的点,以及 (4)update()
在小部件上调用,如下(缩减):
# Amount of pixels to scroll
scroll=penw*len(points)
# The first point is not plotted now, so don't shift the graph for it
if (self.firstPoint()):
scroll-=1
p=QtGui.QPainter(pm)
# Brush setup would be here...
pm.scroll(0-scroll, 0, scroll, 0, pm.width()-scroll, pm.height())
p.drawRect(pm.width()-scroll, 0, scroll, pm.height())
# pen setup etc happens here...
offset=scroll
for point in points:
yValNew = self.graphHeight - (self.scalePoint(point))
# Skip first point
if (not(self.firstPoint())):
p.drawLine(pm.width()-offset-penw, self.yVal, pm.width()-offset, yValNew)
self.yVal = yValNew
offset-=penw
self.update()
最后,paintEvent
简单地将像素图绘制到小部件上:
p = QtGui.QPainter(self)
p.drawPixmap(0, 0, self.graphPixmap)
据我所见,这应该可以正常工作,但是,当数据接收速度非常快(即在每个刻度上绘制整个图表)并且小部件大于某个大小(大约 700 像素)时,一切都到700px 区域的左侧明显滞后。这可能在此视频中得到了最好的展示:http: //dl.dropbox.com/u/1362366/keep/Graph_bug.swf.html(由于帧速率低,视频有点滞后,但效果可见)
有什么想法可能导致这种情况或我可以尝试的事情吗?
谢谢。