void MyWidget::paintEvent(QPaintEvent *evt) { // any initialization QPainter painter(this); QRegion unpainted(evt->clipRegion()); static QPixmap *doubleBuffer = 0; if (!doubleBuffer) doubleBuffer = new QPixmap; QPainter dbPainter(doubleBuffer); for (int i = 0; i < lines.count(); i++) { Line *line = lines[i]; doubleBuffer->resize(QMAX(doubleBuffer->width(), line->boundingRect().width()), QMAX(doubleBuffer->height(), line->boundingRect().height())); doubleBuffer->fill(backgroundColor); line->draw(&dbPainter); painter.drawPixmap(0, line->boundingRect().y(), *doubleBuffer, 0, 0, line->boundingRect().width(), line->boundingRect().height()); unpainted -= line->boundingRect(); } painter.setClipRegion(unpainted); painter.fillRect(unpainted.boundingRect(), backgroundColor); }