1 #include "DrawingWindow.h"
10 class DrawingWindowPrivate { ... }
11 externalize class DrawingThread
14 DrawingWindow::DrawingWindow(ThreadFunction fun, int width, int height)
17 initialize(fun, width, height);
20 DrawingWindow::DrawingWindow(QWidget *parent,
21 ThreadFunction fun, int width, int height)
24 initialize(fun, width, height);
27 DrawingWindow::DrawingWindow(QWidget *parent, Qt::WindowFlags flags,
28 ThreadFunction fun, int width, int height)
29 : QWidget(parent, flags)
31 initialize(fun, width, height);
34 void DrawingWindow::initialize(ThreadFunction fun, int width, int height)
36 image = new QImage(width, height, QImage::Format_RGB32);
37 image->fill(QColor(Qt::white).rgb());
39 painter = new QPainter(image);
43 setFocusPolicy(Qt::StrongFocus);
44 setFixedSize(image->size());
45 setAttribute(Qt::WA_OpaquePaintEvent);
47 timer.start(paintInterval, this);
49 thread = new DrawingThread(*this, fun);
50 thread_started = false;
53 DrawingWindow::~DrawingWindow()
60 void DrawingWindow::setColor(const QColor &color)
62 QPen pen(painter->pen());
67 void DrawingWindow::setColor(float red, float green, float blue)
70 color.setRgbF(red, green, blue);
71 this->setColor(color);
74 void DrawingWindow::drawPoint(int x, int y)
77 painter->drawPoint(x, y);
82 void DrawingWindow::drawLine(int x1, int y1, int x2, int y2)
85 painter->drawLine(x1, y1, x2, y2);
86 setDirtyRect(x1, y1, x2, y2);
90 void DrawingWindow::closeEvent(QCloseEvent *ev)
93 QWidget::closeEvent(ev);
97 void DrawingWindow::paintEvent(QPaintEvent *ev)
99 QPainter widgetPainter(this);
100 QRect rect = ev->rect();
102 QImage imageCopy(*image);
104 widgetPainter.drawImage(rect, imageCopy, rect);
107 void DrawingWindow::showEvent(QShowEvent *ev)
109 if (!thread_started) {
111 thread_started = true;
113 QWidget::showEvent(ev);
116 void DrawingWindow::timerEvent(QTimerEvent *ev)
118 if (ev->timerId() == timer.timerId()) {
125 timer.start(paintInterval, this);
127 QWidget::timerEvent(ev);
131 void DrawingWindow::setDirtyRect(const QRect &rect)
141 DrawingWindow::DrawingThread::DrawingThread(DrawingWindow &w,
148 void DrawingWindow::DrawingThread::run()
150 threadFunction(drawingWindow);