如何避免清除以前在Qt中绘制的点数?

时间:2012-02-28 09:47:46

标签: qt qt4

我想在运行时逐个像素地绘制图像。我使用QPainter和paintEvent来绘制。但是,每次调用paintEvent时,将清除先前绘制的图像并绘制新点。

如何避免清除以前绘制的部分?我只想将新的像素点附加到先前绘制的点上。

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();
}

2 个答案:

答案 0 :(得分:7)

paintEvent应该对事件中指定的窗口小部件区域进行完全重绘。 所以你有责任缓冲以前的结果。

在paintEvent中更改所需的输出并没有多大意义,因为它可能被随机调用,并且当它被调用时无法控制。

如果您想避免使用QGraphicsView

缓冲可以使用QPixmap来完成,Lines是{{1}}类的一部分。您在像素图中绘制像素(而不是在paintStatus中的paint事件中),并在paint事件中绘制像素图。

答案 1 :(得分:1)

QWidget::setAttribute( WA_OpaquePaintEvent, true );

阻止清除小部件。但是,这仅用于优化,以防小部件完成重新绘制。

你应该遵循Hirsch博士的建议。