1 #include "cprojectionpicture.h"
2 #include <QEvent>
3 #include <QPainter>
4 #include <QGesture>
5 #include <QPointF>
6 #include <QPinchGesture>
7 #include <QDebug>
8 #include <QKeyEvent>
9 #include <QMouseEvent>
10 #include <QWheelEvent>
11 #include <QPoint>
12
CProjectionPicture(QWidget * parent)13 CProjectionPicture::CProjectionPicture(QWidget *parent)
14 : QWidget(parent),
15 horizontalOffset(0),
16 verticalOffset(0),
17 scaleFactor(1),
18 currentStepScaleFactor(1),
19 m_translateButton(Qt::LeftButton),
20 m_bMouseTranslate(false),
21 m_zoomDelta(0.2)
22 {
23 this->setFocusPolicy(Qt::ClickFocus);
24 grabGesture(Qt::PanGesture);
25 grabGesture(Qt::PinchGesture);
26 grabGesture(Qt::SwipeGesture);
27 }
setPicture(QImage & image)28 void CProjectionPicture::setPicture(QImage &image)
29 {
30 if(image.format() == QImage::Format_Mono)
31 {
32 qDebug() << "format_mono";
33 currentImage = image.convertToFormat(QImage::Format_Mono);
34 }
35 else if(image.format() == QImage::Format_MonoLSB)
36 {
37 qDebug() << "format_monoLSB";
38 currentImage = image.convertToFormat(QImage::Format_MonoLSB);
39 }
40 else if(image.format() == QImage::Format_Indexed8)
41 {
42 qDebug() << "QImage::Format_Indexed8";
43 currentImage = image.convertToFormat(QImage::Format_Indexed8);
44 }
45 else if(image.format() == QImage::Format_RGB32)
46 {
47 qDebug() << "QImage::Format_RGB32";
48 currentImage = image.convertToFormat(QImage::Format_RGB32);
49 }
50 else if(image.format() == QImage::Format_ARGB32)
51 {
52 qDebug()<<"QImage::Format_ARGB32";
53 currentImage = image.convertToFormat(QImage::Format_ARGB32);
54 }
55
56 else if(image.format() ==QImage::Format_ARGB32_Premultiplied)
57 {
58 qDebug()<<"QImage::Format_ARGB32_Premultiplied";
59 currentImage = image.convertToFormat(QImage::Format_ARGB32_Premultiplied);
60 }
61
62 else if(image.format() == QImage::Format_RGB16)
63 {
64 qDebug("QImage::Format_RGB16");
65 currentImage = image.convertToFormat(QImage::Format_RGB16);
66 }
67
68 else if(image.format() == QImage::Format_ARGB8565_Premultiplied)
69 {
70 qDebug()<<"QImage::Format_ARGB8565_Premultiplied";
71 currentImage = image.convertToFormat(QImage::Format_ARGB8565_Premultiplied);
72 }
73
74 else if(image.format() == QImage::Format_RGB666)
75 {
76 qDebug()<<"QImage::Format_RGB666";
77 currentImage = image.convertToFormat(QImage::Format_RGB666);
78 }
79
80 else if(image.format() == QImage::Format_ARGB6666_Premultiplied)
81 {
82 qDebug()<<"QImage::Format_ARGB6666_Premultiplied";
83 currentImage = image.convertToFormat(QImage::Format_ARGB6666_Premultiplied);
84 }
85
86 else if(image.format() == QImage::Format_RGB555)
87 {
88 qDebug()<<"QImage::Format_RGB555";
89 currentImage = image.convertToFormat(QImage::Format_RGB555);
90 }
91
92 else if(image.format() == QImage::Format_ARGB8555_Premultiplied)
93 {
94 qDebug()<<"QImage::Format_ARGB8555_Premultiplied";
95 currentImage = image.convertToFormat(QImage::Format_ARGB8555_Premultiplied);
96 }
97
98 else if(image.format() == QImage::Format_RGB888)
99 {
100 qDebug()<<"QImage::Format_RGB888";
101 currentImage = image.convertToFormat(QImage::Format_RGB888);
102 }
103
104 else if(image.format() == QImage::Format_RGB444)
105 {
106 qDebug()<<"QImage::Format_RGB444";
107 currentImage = image.convertToFormat(QImage::Format_RGB444);
108 }
109 else if(image.format() == QImage::Format_ARGB4444_Premultiplied)
110 {
111 qDebug()<<"QImage::Format_ARGB4444_Premultiplied";
112 currentImage = image.convertToFormat(QImage::Format_ARGB4444_Premultiplied);
113 }
114 else
115 {
116 qDebug()<<"unkown format";
117 }
118 update();
119 }
120
event(QEvent * event)121 bool CProjectionPicture::event(QEvent *event)
122 {
123 if (event->type() == QEvent::Gesture)
124 return gestureEvent(static_cast<QGestureEvent*>(event));
125 return QWidget::event(event);
126 }
127
paintEvent(QPaintEvent *)128 void CProjectionPicture::paintEvent(QPaintEvent*)
129 {
130 QPainter painter(this);
131 QImage image = currentImage;
132
133
134 if(!image.isNull()){
135 image = image.scaled(this->width()*currentStepScaleFactor * scaleFactor,
136 this->height()*currentStepScaleFactor * scaleFactor,
137 Qt::KeepAspectRatio,
138 Qt::SmoothTransformation);
139 }
140 const qreal iw = image.width();
141 const qreal ih = image.height();
142 const qreal wh = height();
143 const qreal ww = width();
144
145 painter.translate(ww/2, wh/2);
146 painter.translate(horizontalOffset, verticalOffset);
147 //painter.scale(currentStepScaleFactor * scaleFactor, currentStepScaleFactor * scaleFactor);
148 painter.translate(-iw/2, -ih/2);
149 painter.drawImage(0,0,image);
150 }
151 //还原
152 //void CProjectionPicture::mouseDoubleClickEvent(QMouseEvent *)
153 //{
154 // scaleFactor = 1;
155 // currentStepScaleFactor = 1;
156 // verticalOffset = 0;
157 // horizontalOffset = 0;
158 // update();
159 //}
160
gestureEvent(QGestureEvent * event)161 bool CProjectionPicture::gestureEvent(QGestureEvent *event)
162 {
163 if (QGesture *pan = event->gesture(Qt::PanGesture))
164 panTriggered(static_cast<QPanGesture *>(pan));
165 if (QGesture *pinch = event->gesture(Qt::PinchGesture))
166 pinchTriggered(static_cast<QPinchGesture *>(pinch));
167 return true;
168 }
169
panTriggered(QPanGesture * gesture)170 void CProjectionPicture::panTriggered(QPanGesture *gesture)
171 {
172 #ifndef QT_NO_CURSOR
173 switch (gesture->state()) {
174 case Qt::GestureStarted:
175 case Qt::GestureUpdated:
176 setCursor(Qt::SizeAllCursor);
177 break;
178 default:
179 setCursor(Qt::ArrowCursor);
180 }
181 #endif
182 QPointF delta = gesture->delta();
183 horizontalOffset += delta.x();
184 verticalOffset += delta.y();
185 update();
186 }
187
pinchTriggered(QPinchGesture * gesture)188 void CProjectionPicture::pinchTriggered(QPinchGesture *gesture)
189 {
190 QPinchGesture::ChangeFlags changeFlags = gesture->changeFlags();
191 if (changeFlags & QPinchGesture::ScaleFactorChanged) {
192 currentStepScaleFactor = gesture->totalScaleFactor();
193 }
194 if (gesture->state() == Qt::GestureFinished) {
195 scaleFactor *= currentStepScaleFactor;
196 currentStepScaleFactor = 1;
197 }
198 update();
199 }
200
resizeEvent(QResizeEvent * e)201 void CProjectionPicture::resizeEvent(QResizeEvent*e)
202 {
203 update();
204 QWidget::resizeEvent(e);
205 }
206
207
208 //void CProjectionPicture::keyPressEvent(QKeyEvent *event)
209 //{
210 // switch (event->key()) {
211 // qDebug() << event->key();
212 // case Qt::Key_Up:
213 // translate(QPointF(0, -5));
214 // break;
215 // case Qt::Key_Down:
216 // translate(QPointF(0, 5));
217 // break;
218 // case Qt::Key_Left:
219 // translate(QPointF(-5, 0));
220 // break;
221 // case Qt::Key_Right:
222 // translate(QPointF(5, 0));
223 // break;
224 // case Qt::Key_Plus:
225 // zoomIn();
226 // break;
227 // case Qt::Key_Minus:
228 // zoomOut();
229 // break;
230 // default:
231 // QWidget::keyPressEvent(event);
232 // }
233 // QWidget::keyPressEvent(event);
234 //}
235
236
237 //void CProjectionPicture::mouseMoveEvent(QMouseEvent *event)
238 //{
239 // if (m_bMouseTranslate){
240 // QPointF mouseDelta = event->pos() - m_lastMousePos;
241 // translate(mouseDelta);
242 // }
243
244 // m_lastMousePos = event->pos();
245
246 // QWidget::mouseMoveEvent(event);
247 //}
248
249 //void CProjectionPicture::mousePressEvent(QMouseEvent *event)
250 //{
251 // qDebug() << "CProjectionPicture::mousePressEvent";
252 // if (event->button() == m_translateButton) {
253 // m_bMouseTranslate = true;
254 // m_lastMousePos = event->pos();
255 // setCursor(Qt::OpenHandCursor);
256 // }
257
258 // QWidget::mousePressEvent(event);
259 //}
260
261 //void CProjectionPicture::mouseReleaseEvent(QMouseEvent *event)
262 //{
263 // if (event->button() == m_translateButton)
264 // {
265 // m_bMouseTranslate = false;
266 // setCursor(Qt::ArrowCursor);
267 // }
268
269 // QWidget::mouseReleaseEvent(event);
270 //}
271
272
273 //void CProjectionPicture::wheelEvent(QWheelEvent *event)
274 //{
275 // qDebug() << "CProjectionPicture::wheelEvent";
276 //// QPoint numPixels = event->pixelDelta();
277 // QPoint scrallAmount = event->angleDelta();
278 // if(scrallAmount.y() > 0){
279 // zoomIn();
280 // }
281 // else if(scrallAmount.y() < 0){
282 // zoomOut();
283 // }
284 // QWidget::wheelEvent(event);
285 //}
286
zoomIn()287 void CProjectionPicture::zoomIn()
288 {
289 zoom(1 + m_zoomDelta);
290 }
291
292
zoomOut()293 void CProjectionPicture::zoomOut()
294 {
295 zoom(1 - m_zoomDelta);
296 }
297
298
zoom(float scale)299 void CProjectionPicture::zoom(float scale)
300 {
301 scaleFactor *= scale;
302 update();
303 }
304
305
translate(QPointF delta)306 void CProjectionPicture::translate(QPointF delta)
307 {
308 horizontalOffset += delta.x();
309 verticalOffset += delta.y();
310 update();
311 }
312