-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathCanvas.cpp
51 lines (43 loc) · 1.54 KB
/
Canvas.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include <QtGui/QPainter>
#include <QDebug>
#include "Canvas.hpp"
void Canvas::paintEvent(QPaintEvent *event) {
// Gibt es keine Pixel zum Zeichnen, so muss erst
// gar nicht ein QPainter erstellt werden.
if(pixmap.isNull()) {
return;
}
QPainter painter(this);
// Setzt alle Pixel auf Schwarz, damit keine
// Pixel des vorherigen Bilds sichtbar sind.
painter.fillRect(rect(), Qt::black);
painter.drawPixmap(0, 0, pixmap);
}
void Canvas::draw(QImage& image) {
pixmap = QPixmap::fromImage(image);
update();
}
void Canvas::drawOverlay(QStringList infoLines) {
// Ist keine Info vorhanden, so brauchen wir gar nicht
// erst das durchsichtige Rechteck zu zeichnen.
if(infoLines.isEmpty()) {
return;
}
// Füge alle Zeilen zu einem String hinzu, finde die Dimensionen
// des Rechtecks, um eine Box zur Lesbarkeit zu zweichnen.
QString info = infoLines.join("\n");
QPainter painter(&pixmap);
QFontMetrics metrics = painter.fontMetrics();
QRect bgRect = metrics.boundingRect(pixmap.rect(), Qt::TextWordWrap, info);
// Verschiebe die Hintergrund-Box, so dass diese in der
// rechten oberen Ecke des Bildschirms erscheint.
bgRect.moveTo(pixmap.rect().right() - bgRect.width() - 10, 10);
// Zeichne die Hintergrund-Box.
painter.setPen(Qt::NoPen);
painter.setBrush(QColor(0, 0, 0, 127));
painter.drawRect(bgRect.marginsAdded(QMargins(5, 5, 5, 5)));
// Zeichne den Info-Text.
painter.setPen(Qt::white);
painter.drawText(pixmap.rect().marginsRemoved(QMargins(10, 10, 10, 10)), Qt::AlignRight, info);
update();
}