2012-02-28 10 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を使用します。

Linesクラスの一部であるQPixmapを使用してバッファリングを行うことができます。ピックスマップにピクセルを描画し(paintStateではなくupdateStatusで)、ピックスマップをpaintイベントに描画します。

1

QWidget::setAttribute(WA_OpaquePaintEvent, true);

ウィジェットをクリアしないように。ただし、ウィジェットが完全な再描画を行う場合の最適化のためだけです。

ハーシュ博士のアドバイスに従ってください。

+0

混乱を広げて申し訳ありませんが、私は "Dr." :-) – hirschhornsalz

関連する問題