2010-11-15 46 views
0

我是QT的新手。我正在研究圖形。QT中的優化畫線

我正在使用QWidget繪製圖形(用於在QWidget繪圖事件中繪製圖形)。我需要繪製背景和前景圖形。背景是固定的圖形。前景我畫線。

每100毫秒我需要畫20點。這個繪圖時間是8秒。總計我需要畫1600點(總點代表爭議線)。

我使用QTimer在每100ms中調用此繪圖。前幾張圖畫得非常快。在繪圖中間變得很慢。

問題是我需要在每100ms中繪製所有的前景和背景。

請幫我解決這個問題。如果有任何人有樣品代碼請提供。提前致謝。

有沒有什麼辦法只繪製局部區域即。只有特定的圖形修改區域?

+0

你看過[graphicsview](http://doc.qt.nokia.com/4.6/graphicsview.html)還是嘗試使用GL小部件進行繪圖? – 2010-11-15 11:02:29

+0

我讀到了,但我很困惑。 QWidget繪圖讓我感覺非常輕鬆。請給出一些建議。我繼續使用QWidget或使用GraphicsView?如果我使用grphicsview,那麼如何畫線? – saravanan 2010-11-15 11:14:23

+0

你可以發佈你的實際代碼的樣本嗎? – 2010-11-15 13:17:06

回答

3

如果沒有硬件支持,QPainter繪圖速度會很慢。如果所有行都可見,則使用QGraphicsView將無濟於事,因爲它無論如何都在內部使用QPainter。

如果你只需要每次更新,每個更新的背景畫20個新點(或線)將被清除,所以你必須再次渲染一切,有一些事情你可以嘗試:

1)禁止後臺自動填充。請參閱:QWidget::autoFillBackground 這樣的事情添加到您的控件初始化:

setAutoFillBackground(false); 
setAttribute(Qt::WA_OpaquePaintEvent, true); 
setAttribute(Qt::WA_NoSystemBackground, true); 

現在,在第一次更新渲染背景和第一線。對於下一次更新,只需跳過渲染背景並僅渲染新行。

2)使用雙緩衝。例如,創建小部件大小的QImage。

.h 
private: 
    QImage m_targetImage; 


.cpp 
    // constructor 
    m_targetImage = QImage(width(), height(), QImage::Format_ARGB32); 

    // paint event 

    // draw to image 
    QPainter p; 
    p.begin(&m_targetImage); 
    static bool firstUpdate = true; 
    if (firstUpdate) 
    { 
    // draw background) 
    p.drawImage(...); 
    firstUpdate = false; 
    } 

    // draw latest lines 
    p.drawLines(....); 
    p.end(); 

    // draw image in widget paint 
    QPainter painter; 
    painter.begin(this); 
    painter.drawImage(0, 0, m_targetImage); 
    painter.end(); 

3)如果可能,使用QGLWidget。從QGLWidget而不是QWidget繼承你的小部件。此方法不適用於所有平臺,並且速度提升可能還不夠。同樣使用OpenGL會帶來各種新問題。

+0

非常感謝。它正在工作。我使用QWidget本身。畫面平滑,速度也不錯。 – saravanan 2010-11-16 06:04:43