Qt-widget画坐标系以及一些功能

窗口:

 

 

mywidget.h:

 1 #ifndef MYWIDGET_H
 2 #define MYWIDGET_H
 3 
 4 #include <QWidget>
 5 #include "ui_mywidget.h"
 6 #include <QPaintEvent>
 7 #include <QtGui>
 8 
 9 class MyWidget : public QWidget
10 {
11     Q_OBJECT
12 
13 public:
14     MyWidget(QWidget *parent = 0);
15     ~MyWidget();
16     QPointF ObjectPtoDisplayP(QPointF objPoint);
17     QPointF DisplayPtoObjectP(QPointF disPoint);
18     QPointF WidgetPtoObjectP(QPointF wigPoint);
19     QPointF ObjectPtoWidgetP(QPointF objPoint);
20     QPointF ValuePtoObjectP(QPointF valPoint);
21     QPointF ObjectPtoValueP(QPointF objPoint);
22     QPointF scaleIn(QPointF pos_before, QPointF scale_center, double scale_value);
23     QPointF scaleOut(QPointF pos_before, QPointF scale_center, double scale_value);
24 
25 protected:
26     void paintEvent(QPaintEvent *event);
27     void wheelEvent(QWheelEvent *event);
28     void mousePressEvent(QMouseEvent *event);
29     void mouseMoveEvent(QMouseEvent *event);
30 
31 private:
32     Ui::MyWidget ui;
33 
34     int margin_size;
35 
36     QPointF paint_org;              //widget坐标系
37     QSize paint_size_first;
38     QSize paint_size_old;
39     QSize paint_size_new;
40     QPointF paint_center_old;       //display坐标系
41     QPointF paint_center_new;       //display坐标系
42 
43     double offset_x;
44     double offset_y;
45 
46     QPointF rect_center;           //display坐标系
47     QPointF rect_topl;             //display坐标系
48     QPointF rect_bottomr;          //display坐标系
49 
50     double scale_value;
51 
52     QPointF mousepress_org;        //display坐标系
53 
54     QPointF axis_x_old;            //display坐标系
55     QPointF axis_y_old;            //display坐标系
56     double axis_scale;
57 
58     double offsetv_x;
59     double offsetv_y;
60     double pixel_per_mm;
61 
62     QPointF mouse_current_pos;      //object坐标系
63 };
64 
65 #endif // MYWIDGET_H

 

 

mywidget.cpp:

  1 #include "mywidget.h"
  2 
  3 MyWidget::MyWidget(QWidget *parent)
  4     : QWidget(parent)
  5 {
  6     ui.setupUi(this);
  7 
  8     margin_size = 35;
  9 
 10     paint_org = QPointF(margin_size + 20, margin_size - 20);      
 11     paint_size_first = QSize(this->width() - margin_size * 2, this->height() - margin_size * 2);
 12     paint_size_old = paint_size_first;
 13     paint_size_new = paint_size_first;
 14     paint_center_old = QPointF(paint_size_first.width() / 2, paint_size_first.height() / 2);   
 15     paint_center_new = paint_center_old;
 16 
 17     offset_x = 0;
 18     offset_y = paint_size_new.height();
 19 
 20     rect_center = QPointF(paint_size_new.width() / 2, paint_size_new.height() / 2);   
 21     rect_topl = QPointF(rect_center.rx() - (paint_size_new.height() / 2 - 15), rect_center.ry() + (paint_size_new.height() / 2 - 15));
 22     rect_bottomr = QPointF(rect_center.rx() + (paint_size_new.height() / 2 - 15), rect_center.ry() - (paint_size_new.height() / 2 - 15));
 23 
 24     scale_value = 1.05;
 25 
 26     mousepress_org = QPointF(0, 0);
 27 
 28     axis_x_old = QPointF(rect_center.rx(), 0);
 29     axis_y_old = QPointF(0, rect_center.ry());
 30 
 31     axis_scale = 20.0;
 32 
 33     offsetv_x = rect_center.rx();
 34     offsetv_y = rect_bottomr.ry();
 35     pixel_per_mm = (double)(rect_bottomr.rx() - rect_topl.rx()) / 600;
 36 
 37     mouse_current_pos = QPointF(rect_center.rx(), rect_center.ry());
 38     this->setMouseTracking(true);
 39 
 40     //this->resize(880, 640);
 41 }
 42 
 43 MyWidget::~MyWidget()
 44 {
 45 
 46 }
 47 
 48 void MyWidget::paintEvent(QPaintEvent *event)
 49 {
 50     paint_size_new = QSize(this->width() - margin_size * 2, this->height() - margin_size * 2);
 51 
 52     QImage image = QImage(paint_size_new, QImage::Format_RGB32);
 53     QColor backColor = qRgb(255, 255, 255);
 54     image.fill(backColor);
 55 
 56     if (paint_size_new != paint_size_old)
 57     {
 58         offset_x = 0;
 59         offset_y = paint_size_new.height();
 60 
 61         paint_center_new = QPointF(paint_size_new.width() / 2, paint_size_new.height() / 2);
 62         rect_center = paint_center_new - paint_center_old + rect_center;
 63         rect_topl = paint_center_new - paint_center_old + rect_topl;
 64         rect_bottomr = paint_center_new - paint_center_old + rect_bottomr;
 65 
 66         paint_size_old = paint_size_new;
 67         paint_center_old = paint_center_new;
 68     }
 69 
 70     offsetv_x = rect_center.rx();
 71     offsetv_y = rect_bottomr.ry();
 72     pixel_per_mm = (double)(rect_bottomr.rx() - rect_topl.rx()) / 600;
 73 
 74     QPainter painter2(&image);
 75     QRectF rec(DisplayPtoObjectP(rect_topl), DisplayPtoObjectP(rect_bottomr));
 76     painter2.drawRect(rec);
 77      painter2.drawPoint(DisplayPtoObjectP(rect_center));
 78     painter2.drawText(QPointF(mouse_current_pos.rx(), mouse_current_pos.ry()), "(" + QString::number(ObjectPtoValueP(mouse_current_pos).rx(), 'f', 1) + "mm, " + QString::number(ObjectPtoValueP(mouse_current_pos).ry(), 'f', 1) + "mm)");
 79     //painter2.drawPoint(ValuePtoObjectP(QPointF(-150.0, 150.0)));            //(-150mm, 150mm)
 80 
 81     QPainter painter(this);
 82      //painter.setRenderHint(QPainter::Antialiasing, true);
 83     painter.drawLine(ObjectPtoWidgetP(DisplayPtoObjectP(QPointF(0, 0))), ObjectPtoWidgetP(DisplayPtoObjectP(QPointF(image.width(), 0))));
 84     painter.drawLine(ObjectPtoWidgetP(DisplayPtoObjectP(QPointF(-0.01, 0))), ObjectPtoWidgetP(DisplayPtoObjectP(QPointF(-0.01, image.height()))));
 85 
 86     painter.drawLine(ObjectPtoWidgetP(DisplayPtoObjectP(QPointF(0, 0))), ObjectPtoWidgetP(DisplayPtoObjectP(QPointF(0, -10))));
 87     painter.drawLine(ObjectPtoWidgetP(DisplayPtoObjectP(QPointF(0, 0))), ObjectPtoWidgetP(DisplayPtoObjectP(QPointF(-10, 0))));
 88     painter.drawLine(ObjectPtoWidgetP(DisplayPtoObjectP(QPointF(image.width(), 0))), ObjectPtoWidgetP(DisplayPtoObjectP(QPointF(image.width(), -10))));
 89     painter.drawLine(ObjectPtoWidgetP(DisplayPtoObjectP(QPointF(0, image.height()))), ObjectPtoWidgetP(DisplayPtoObjectP(QPointF(-10, image.height()))));
 90     painter.drawText(ObjectPtoWidgetP(DisplayPtoObjectP(QPointF(0, -20))), QString::number((double)(0 - offsetv_x) / pixel_per_mm, 'f', 1));
 91     painter.drawText(ObjectPtoWidgetP(DisplayPtoObjectP(QPointF(-30, 0))), QString::number((double)(0 - offsetv_y) / pixel_per_mm, 'f', 1));
 92     painter.drawText(ObjectPtoWidgetP(DisplayPtoObjectP(QPointF(image.width(), -20))), QString::number((double)(image.width() - offsetv_x) / pixel_per_mm, 'f', 1));
 93     painter.drawText(ObjectPtoWidgetP(DisplayPtoObjectP(QPointF(-30, image.height()))), QString::number((double)(image.height() - offsetv_y) / pixel_per_mm, 'f', 1));
 94     painter.drawText(ObjectPtoWidgetP(DisplayPtoObjectP(QPointF(image.width() / 2, -35))), QString(tr("X [mm]")));
 95     painter.rotate(-90);
 96     painter.drawText(QPointF(- (image.height() / 2 + 20), 15), QString(tr("Z [mm]")));
 97     painter.rotate(90);
 98 
 99     if (rect_center.rx() > 0 && rect_center.rx() < image.width())
100     {
101         painter.drawLine(ObjectPtoWidgetP(DisplayPtoObjectP(QPointF(rect_center.rx(), 0))), ObjectPtoWidgetP(DisplayPtoObjectP(QPointF(rect_center.rx(), -10))));
102         painter.drawText(ObjectPtoWidgetP(DisplayPtoObjectP(QPointF(rect_center.rx(), -20))), QString::number((double)(rect_center.rx() - offsetv_x) / pixel_per_mm, 'f', 1));
103     }
104     
105     if (rect_center.ry() > 0 && rect_center.ry() < image.height())
106     {
107         painter.drawLine(ObjectPtoWidgetP(DisplayPtoObjectP(QPointF(0, rect_center.ry()))), ObjectPtoWidgetP(DisplayPtoObjectP(QPointF(-10, rect_center.ry()))));
108         painter.drawText(ObjectPtoWidgetP(DisplayPtoObjectP(QPointF(-30, rect_center.ry()))), QString::number((double)(rect_center.ry() - offsetv_y) / pixel_per_mm, 'f', 1));
109     }
110 
111     if (axis_scale >= 35.0)
112     {
113         axis_scale = axis_scale / 2;
114     }
115     else if (axis_scale <= 15.0)
116     {
117         axis_scale = axis_scale * 2;
118     }
119 
120     axis_x_old = QPointF(rect_center.rx(),0);
121     int i = 0;
122     while (axis_x_old.rx() > axis_scale)
123     {
124         axis_x_old.rx() = axis_x_old.rx() - axis_scale;
125         i++;
126         if (axis_x_old.rx() > 0 && axis_x_old.rx() < image.width())
127         {
128             if (i % 5 == 0)
129             {
130                 painter.drawLine(ObjectPtoWidgetP(DisplayPtoObjectP(QPointF(axis_x_old.rx(), 0))), ObjectPtoWidgetP(DisplayPtoObjectP(QPointF(axis_x_old.rx(), -10))));
131                 painter.drawText(ObjectPtoWidgetP(DisplayPtoObjectP(QPointF(axis_x_old.rx(), -20))), QString::number((double)(axis_x_old.rx() - offsetv_x) / pixel_per_mm, 'f', 1));
132             }
133             else
134             {
135                 painter.drawLine(ObjectPtoWidgetP(DisplayPtoObjectP(QPointF(axis_x_old.rx(), 0))), ObjectPtoWidgetP(DisplayPtoObjectP(QPointF(axis_x_old.rx(), -5))));
136             }
137         }
138     }
139     axis_x_old = QPointF(rect_center.rx(), 0);
140     i = 0;
141     while ((image.width() - axis_x_old.rx()) > axis_scale)
142     {
143         axis_x_old.rx() = axis_x_old.rx() + axis_scale;
144         i++;
145         if (axis_x_old.rx() > 0 && axis_x_old.rx() < image.width())
146         {
147             if (i % 5 == 0)
148             {
149                 painter.drawLine(ObjectPtoWidgetP(DisplayPtoObjectP(QPointF(axis_x_old.rx(), 0))), ObjectPtoWidgetP(DisplayPtoObjectP(QPointF(axis_x_old.rx(), -10))));
150                 painter.drawText(ObjectPtoWidgetP(DisplayPtoObjectP(QPointF(axis_x_old.rx(), -20))), QString::number((double)(axis_x_old.rx() - offsetv_x) / pixel_per_mm, 'f', 1));
151             }
152             else
153             {
154                 painter.drawLine(ObjectPtoWidgetP(DisplayPtoObjectP(QPointF(axis_x_old.rx(), 0))), ObjectPtoWidgetP(DisplayPtoObjectP(QPointF(axis_x_old.rx(), -5))));
155             }
156         }
157     }
158 
159     axis_y_old = QPointF(0, rect_center.ry());
160     i = 0;
161     while (axis_y_old.ry() > axis_scale)
162     {
163         axis_y_old.ry() = axis_y_old.ry() - axis_scale;
164         i++;
165         if (axis_y_old.ry() > 0 && axis_y_old.ry() < image.height())
166         {
167             if (i % 5 == 0)
168             {
169                 painter.drawLine(ObjectPtoWidgetP(DisplayPtoObjectP(QPointF(0, axis_y_old.ry()))), ObjectPtoWidgetP(DisplayPtoObjectP(QPointF(-10, axis_y_old.ry()))));
170                 painter.drawText(ObjectPtoWidgetP(DisplayPtoObjectP(QPointF(-30, axis_y_old.ry()))), QString::number((double)(axis_y_old.ry() - offsetv_y) / pixel_per_mm, 'f', 1));
171             }
172             else
173             {
174                 painter.drawLine(ObjectPtoWidgetP(DisplayPtoObjectP(QPointF(0, axis_y_old.ry()))), ObjectPtoWidgetP(DisplayPtoObjectP(QPointF(-5, axis_y_old.ry()))));
175             }
176         }
177     }
178     axis_y_old = QPointF(0, rect_center.ry());
179     i = 0;
180     while ((image.height() - axis_y_old.ry()) > axis_scale)
181     {
182         axis_y_old.ry() = axis_y_old.ry() + axis_scale;
183         i++;
184         if (axis_y_old.ry() > 0 && axis_y_old.ry() < image.height())
185         {
186             if (i % 5 == 0)
187             {
188                 painter.drawLine(ObjectPtoWidgetP(DisplayPtoObjectP(QPointF(0, axis_y_old.ry()))), ObjectPtoWidgetP(DisplayPtoObjectP(QPointF(-10, axis_y_old.ry()))));
189                 painter.drawText(ObjectPtoWidgetP(DisplayPtoObjectP(QPointF(-30, axis_y_old.ry()))), QString::number((double)(axis_y_old.ry() - offsetv_y) / pixel_per_mm, 'f', 1));
190             }
191             else
192             {
193                 painter.drawLine(ObjectPtoWidgetP(DisplayPtoObjectP(QPointF(0, axis_y_old.ry()))), ObjectPtoWidgetP(DisplayPtoObjectP(QPointF(-5, axis_y_old.ry()))));
194             }
195         }
196     }
197 
198     painter.drawImage(paint_org, image);
199 }
200 
201 void MyWidget::wheelEvent(QWheelEvent *event)
202 {
203      QPointF mousepos = WidgetPtoObjectP(event->pos());
204      if (event->delta() > 0)    
205      {
206         rect_center = scaleIn(rect_center, ObjectPtoDisplayP(mousepos), scale_value);
207         rect_topl = scaleIn(rect_topl, ObjectPtoDisplayP(mousepos), scale_value);
208         rect_bottomr = scaleIn(rect_bottomr, ObjectPtoDisplayP(mousepos), scale_value);
209         axis_scale = axis_scale * scale_value;
210      }
211      else
212      {
213         rect_center = scaleOut(rect_center, ObjectPtoDisplayP(mousepos), scale_value);
214         rect_topl = scaleOut(rect_topl, ObjectPtoDisplayP(mousepos), scale_value);
215         rect_bottomr = scaleOut(rect_bottomr, ObjectPtoDisplayP(mousepos), scale_value);
216         axis_scale = axis_scale / scale_value;
217       }
218       
219        repaint();
220 }
221 
222 void MyWidget::mouseMoveEvent(QMouseEvent *event)
223 {
224     mouse_current_pos = WidgetPtoObjectP(event->pos());
225 
226     if (event->buttons() & Qt::LeftButton)
227     {
228         QPointF mousepos_move = ObjectPtoDisplayP(WidgetPtoObjectP(event->pos()));
229         
230         rect_center = mousepos_move - mousepress_org + rect_center;
231         rect_topl = mousepos_move - mousepress_org + rect_topl;
232         rect_bottomr = mousepos_move - mousepress_org + rect_bottomr;
233         
234         mousepress_org = mousepos_move;
235     }
236 
237     repaint();
238 }
239 
240 void MyWidget::mousePressEvent(QMouseEvent *event)
241 {
242     if (event->button() == Qt::LeftButton)
243     {
244         mousepress_org = ObjectPtoDisplayP(WidgetPtoObjectP(event->pos()));
245     }
246 }
247 
248 QPointF MyWidget::ObjectPtoDisplayP(QPointF objPoint)
249 {
250     return QPointF(objPoint.rx() - offset_x, -objPoint.ry() + offset_y);
251 }
252 
253 QPointF MyWidget::DisplayPtoObjectP(QPointF disPoint)
254 {
255     return QPointF(disPoint.rx() + offset_x, -disPoint.ry() + offset_y);
256 }
257 
258 QPointF MyWidget::scaleIn(QPointF pos_before, QPointF scale_center, double scale_value)
259 {
260     QPointF temp;
261     temp.rx() = (double)(pos_before.rx() - scale_center.rx()) * scale_value + scale_center.rx();
262     temp.ry() = (double)(pos_before.ry() - scale_center.ry()) * scale_value + scale_center.ry();
263     return temp;
264 }
265 
266 QPointF MyWidget::scaleOut(QPointF pos_before, QPointF scale_center, double scale_value)
267 {
268     QPointF temp;
269     temp.rx() = (double)(pos_before.rx() - scale_center.rx()) / scale_value + scale_center.rx();
270     temp.ry() = (double)(pos_before.ry() - scale_center.ry()) / scale_value + scale_center.ry();
271     return temp;
272 }
273 
274 QPointF MyWidget::WidgetPtoObjectP(QPointF wigPoint)
275 {
276     return QPointF(wigPoint - paint_org);
277 }
278 
279 QPointF MyWidget::ObjectPtoWidgetP(QPointF objPoint)
280 {
281     return QPointF(objPoint + paint_org);
282 }
283 
284 QPointF MyWidget::ValuePtoObjectP(QPointF valPoint)
285 {
286     return DisplayPtoObjectP(QPointF(valPoint.rx() * pixel_per_mm + offsetv_x, valPoint.ry() * pixel_per_mm + offsetv_y));
287 }
288 
289 QPointF MyWidget::ObjectPtoValueP(QPointF objPoint)
290 {
291     return QPointF((double)(ObjectPtoDisplayP(objPoint).rx() - offsetv_x) / pixel_per_mm, (double)(ObjectPtoDisplayP(objPoint).ry() - offsetv_y) / pixel_per_mm);
292 }

 

 

代码搞得有点复杂,用于显示三维轮廓测量的深度轮廓。

特点:
1、显示鼠标点坐标值

2、矩形框坐标值固定

  ①以鼠标点为中心滚轮等比例缩放,矩形框随之缩放,坐标轴跟着缩放(减少和插入中间值)

  ②鼠标左击拖动白板视窗,矩形框随之移动,坐标值跟着移动

 3、窗口缩放,坐标系整体不缩放

 

有一个问题,Z轴的0.0值在缩放之后会变成-0.0,暂时未找到原因。

因为是第一次写,思路可能不是很好,有更好的方法的话,可以探讨。

 

posted @ 2016-10-09 17:12  凯撒大猩猩  阅读(5003)  评论(0编辑  收藏  举报