2012-02-28 190 views
2

我想在運行時逐個像素地繪製圖像。我使用QPainter和paintEvent繪製。但是,每次調用paintEvent時,先前繪製的圖像將被清除,並且繪製新點。如何避免清除之前在Qt中繪製的點?

如何避免清除以前繪製的零件?我只想將新像素點附加到先前繪製的點上。

Lines::Lines(QWidget *parent) 
    : QWidget(parent) 
{ 
    m_timer = new QTimer(this); 
    connect(m_timer, SIGNAL(timeout()), this, SLOT(updateStatus())); 
    m_timer->start(); 
    m_x = 0; 
    m_y = 0; 
} 

void Lines::paintEvent(QPaintEvent *event) 
{ 
    QPen pen(Qt::black, 2, Qt::SolidLine); 
    QPainter painter(this); 
    painter.setPen(pen); 
    painter.drawPoint(m_x, m_y);  
} 

void Lines::updateStatus() 
{ 
    m_x++; 
    m_y++; 
    update(); 
} 

回答

7

paintEvent應該完成對事件中指定的窗口小部件區域的完整重繪。 所以你負責緩衝以前的結果。

對於paintEvent中的所需輸出更改沒有任何意義,因爲它可能是隨機調用的,調用時不受控制。

如果你想避免,你可以使用QGraphicsView

緩衝可以使用QPixmap來完成,這將是Lines類的一部分。您可以在像素圖中繪製像素(不在繪製事件中,在updateStatus中),並在繪製事件中繪製像素圖。

1

QWidget::setAttribute(WA_OpaquePaintEvent, true);

防止清除部件。然而,這只是爲了優化,以防小部件完成重繪。

您應該按照赫希博士的建議。

+0

對不起傳播混亂,但我不是「博士」 :-) – hirschhornsalz 2012-02-28 13:38:01