template <typename T>class QOffscreenDraw : public T{ QPixmap backBuffer; bool bOnlyCopyBackBuffer;public: QOffscreenDraw(QWidget * parent = 0, Qt::WindowFlags f = 0) : T(parent, f) , backBuffer() , bOnlyCopyBackBuffer(false) { backBuffer = QPixmap ( width(), height() ); /* T:: */ setAttribute(Qt::WA_PaintOnScreen); } QPixmap* getOffscreenBuffer() { return &backBuffer; // QPainter(&backBuffer); } void updateFromBackBuffer() { bOnlyCopyBackBuffer = true; repaint(); bOnlyCopyBackBuffer = false; }protected: virtual void doPaint( QPainter *painter, QPaintEvent *event ) {} void resizeEvent( QResizeEvent * event ) { T::resizeEvent(event); if (!event->isAccepted()) return; backBuffer = QPixmap( event->size() ); } void paintEvent(QPaintEvent *event) { if (!bOnlyCopyBackBuffer) { QPainter painter(&backBuffer); doPaint( &painter, event ); } QPainter thisPainter(this); thisPainter.drawPixmap( QRect( 0, 0, width(), height()), backBuffer, QRect( 0, 0, width(), height()) ); }};class RenderArea : QOffscreenDraw<QWidget>
// испорльзовать такclass RenderArea : QOffscreenDraw<QWidget>{ // переопределяем для рисования всей картинки целиком void doPaint( QPainter *painter, QPaintEvent *event );};// Если нужно асинхронно (не в paintEvente) порисовать, делаем так{ ... { // QPainter заключили в отдельную область видимости, чтоб он разрушился перед копированием картинки, // можно сделать p.end(); QPainter p(renderArea->getOffscreenBuffer()); // рисуем } renderArea->updateFromBackBuffer();}