-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathscribblearea.cpp
111 lines (94 loc) · 3 KB
/
scribblearea.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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
#include <QtWidgets>
#include "scribblearea.h"
//Đây là source file gồm các tính năng của khung vẽ bao gồm ( mở ảnh, lưu ảnh, chỉnh màu bút, độ rộng và 1 số event xoay quanh những hành động này )
ScribbleArea::ScribbleArea(QWidget *parent) : QWidget(parent)
{
setAttribute(Qt::WA_StaticContents);
modified = false;
scribbling = false;
myPenWidth = 1;
myPenColor = Qt::blue;
}
bool ScribbleArea::openImage(const QString &fileName){
QImage loadedImage;
if(!loadedImage.load(fileName)){
return false;
}
QSize newSize = loadedImage.size().expandedTo(size());
resizeImage(&loadedImage, newSize);
image = loadedImage;
modified = false;
update();
return true;
}
bool ScribbleArea::saveImage(const QString &fileName, const char *fileFormat){
QImage visibleImage = image;
resizeImage(&visibleImage, size());
if(visibleImage.save(fileName, fileFormat)){
modified = false;
return true;
}else{
return false;
}
}
void ScribbleArea::setPenColor(const QColor &newColor){
myPenColor = newColor;
}
void ScribbleArea::setPenWidth(int newWidth){
myPenWidth = newWidth;
}
void ScribbleArea::clearImage(){
image.fill(qRgb(255, 255, 255));
modified = true;
update();
}
void ScribbleArea::mousePressEvent(QMouseEvent *event){
if(event->button() == Qt::LeftButton){
lastPoint = event->pos();
scribbling = true;
}
}
void ScribbleArea::mouseMoveEvent(QMouseEvent *event){
if((event->buttons() & Qt::LeftButton) && scribbling){
drawLineTo(event->pos());
}
}
void ScribbleArea::mouseReleaseEvent(QMouseEvent *event){
if(event->button() == Qt::LeftButton && scribbling){
drawLineTo(event->pos());
scribbling = false;
}
}
void ScribbleArea::paintEvent(QPaintEvent *event){
QPainter painter(this);
QRect dirtyRect = event->rect();
painter.drawImage(dirtyRect, image, dirtyRect);
}
void ScribbleArea::resizeEvent(QResizeEvent *event){
if(width() > image.width() || height() > image.height()){
int newWidth = qMax(width() + 128, image.width());
int newHeight = qMax(height() + 128, image.height());
resizeImage(&image, QSize(newWidth, newHeight));
update();
}
QWidget::resizeEvent(event);
}
void ScribbleArea::drawLineTo(const QPoint &endPoint){
QPainter painter(&image);
painter.setPen(QPen(myPenColor, myPenWidth, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin));
painter.drawLine(lastPoint, endPoint);
modified = true;
int rad =(myPenWidth / 2) + 2;
update(QRect(lastPoint, endPoint).normalized().adjusted(-rad, -rad, +rad, +rad));
lastPoint = endPoint;
}
void ScribbleArea::resizeImage(QImage *image, const QSize &newSize){
if(image->size() == newSize){
return;
}
QImage newImage(newSize, QImage::Format_RGB32);
newImage.fill(qRgb(255, 255, 255));
QPainter painter(&newImage);
painter.drawImage(QPoint(0, 0), *image);
*image = newImage;
}