我正在研究一個基於Qt的應用程序(實際上在PyQt中,但我認爲這不是相關的),其中一部分涉及繪製一個潛在的連續流的數據實時顯示在圖表上。Qt/PyQt - 頻繁繪製像素映射到窗口小部件,部分繪圖不正確
我已經通過創建一個從QWidget
派生的類來實現此功能,該類對輸入數據進行緩衝,並且每30ms(默認情況下)繪製圖表。在__init__()
中,創建了一個QPixmap
,並且在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)
作爲就我所見,這應該可以正常工作,但是,當數據接收速度非常快時(即整個圖形正在繪製每個剔號都有),並且該部件大於特定尺寸(大約700px),700px區域左側的所有內容都相當滯後。這可能是最好的演示在這個視頻:http://dl.dropbox.com/u/1362366/keep/Graph_bug.swf.html(由於低幀率,視頻有點遲緩,但效果是可見的)
任何想法什麼可能導致這個或我可以嘗試的東西?
謝謝。