• 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,暂时未找到原因。

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

  • 相关阅读:
    善用js 异步引入,大幅提升vue站点加载速度,媲美大厂流畅性
    react hooks useState 赋值优化解决方案
    vue hash模式下的微信授权详解
    图片之间没加空格有间隙的解决方案
    React 父组件重新渲染,子组件不需要渲染的三种性能优化方式(PureComponent,memo,shouldComponentUpdate);
    uniapp历史模式history配置
    vue下请求数据地址的封装
    h5 下ios适配底部小黑条,简单解决方案,只需一步
    overflow:hidden 失效问题
    h5下数字,字母不换行的解决方案
  • 原文地址:https://www.cnblogs.com/Jace-Lee/p/5943026.html
Copyright © 2020-2023  润新知