#include <QtGui>#include <QThread>#define WIDTH 800#define HEIGHT 600// отделный поток для рисования// каждую секунду рисует по прямоугольнику, пока не заполнится окноclass myThread : public QThread{ private: QPixmap *where2Draw; QWidget *what2Update; public: myThread(QWidget *aWidget, QPixmap *aPixmap) : QThread() { this->what2Update=aWidget; this->where2Draw=aPixmap; } void run() { // "цикл" потока QPainter p(this->where2Draw); for (int i=0;i<WIDTH;i+=10) { // определяем очередно прямоугольник QRect r=QRect::QRect(i,30,5,30); // рисуем прямоугольник в буфер p.drawRect(r); // далее идет "вывод на экран": // 1. определяем область, которая изменилась. в нашем случае это // область, куда мы только что "нарисовали" наш прямоугольник // ajust () необходим, чтобы немного расширить область, чтобы // нарисованный прямоугольник гарантированно отобразился на // экране целиком // 2. вызываем QWidget::update(QRect), которая инициирует // вызов paintEvent, где мы уже и выведем содержимое измененной // области на экран r.adjust(0,0,1,1); this->what2Update->update(r); this->sleep(1); } }};class myWidget : public QWidget{ public: // это графический буфер, на котором мы будем "рисовать" QPixmap *buffer; myWidget (QWidget *parent=0) : QWidget(parent) { // установка "габаритов" this->setMaximumWidth(WIDTH); this->setMaximumHeight(HEIGHT); this->resize(WIDTH,HEIGHT); // создаем буфер QPixmap buffer=new QPixmap(WIDTH,HEIGHT); // просто ради примера выводим произвольную графику // лишь бы за пределами paintEvent QPainter p(buffer); p.fillRect(QRect::QRect(0,0,WIDTH,HEIGHT),Qt::green); p.drawText(10,10,"Hi, man!"); p.drawLine(0,0,WIDTH,HEIGHT); // "выводим" содержимое буфера на экран this->update(); } ~myWidget () { delete (buffer); } // переопределяем paintEvent, чтобы он выводил на экран содержимое нашего буфера void paintEvent(QPaintEvent *p) { QPainter painter(this); // следующий метод копирует содержимое QPixmap из области, // определенной в QRect "на экран" painter.drawPixmap(p->rect(),*buffer,p->rect()); }};int main(int argc, char *argv[]){ QApplication a(argc, argv); myWidget w; w.show(); myThread t(&w,w.buffer); t.start(); return a.exec();}