#include #include #include #include #include #include #include #include QMutex g_mutex; class Canvas : public QWidget { Q_OBJECT public: Canvas(QWidget* parent=0); void drawStuff(); protected: void paintEvent(QPaintEvent *); QImage m_image; }; class RenderThread : public QThread { public: RenderThread(Canvas* canvas) : m_canvas(canvas), m_stopping(false) {} void run(); void stop() { m_stopping = true; } private: Canvas* m_canvas; bool m_stopping; }; class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = 0); ~MainWindow(); private: RenderThread* m_renderThread; }; Canvas::Canvas(QWidget *parent) : QWidget(parent), m_image(256,256, QImage::Format_ARGB32_Premultiplied) { m_image.fill(0xffffffff); } void Canvas::drawStuff() { g_mutex.lock(); m_image.fill(0xffffffff); QPainter painter(&m_image); QPen pen(QColor(40,90,180,200)); pen.setWidthF(12.0f); painter.setPen(pen); painter.drawLine(QPointF(0,0), QPointF(256,256)); g_mutex.unlock(); } void Canvas::paintEvent(QPaintEvent *) { g_mutex.lock(); QPainter p(this); p.drawImage(0,0, m_image); g_mutex.unlock(); } void RenderThread::run() { while(!m_stopping) { m_canvas->drawStuff(); msleep(10); } } MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { Canvas* canvas = new Canvas(this); setCentralWidget(canvas); m_renderThread = new RenderThread(canvas); m_renderThread->start(); } MainWindow::~MainWindow() { m_renderThread->stop(); m_renderThread->wait(); delete m_renderThread; } int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; w.show(); return a.exec(); } #include "main.moc"