本篇教程讲解在Qt中实现从屏幕坐标到自定义逻辑坐标系的转换方法,并介绍如何在此过程中进行图形绘制。
本资源介绍的是Qt绘图基础中的世界坐标系转换为逻辑坐标系的方法。在该例子中,世界坐标系的原点位于视图左上角,通过进行世界坐标的转换操作后可以将新的坐标原点定位到视图中央,并且Y轴朝向上方而X轴向右延伸。接着绘制了相应的坐标轴,在基于逻辑坐标系下的绘图过程中可以选择性地取消物理与逻辑坐标之间的转换关系函数以对比两种不同系统中的图形表示效果。
重写的PainterEvent函数如下:
```cpp
void QtPixPainter::paintEvent(QPaintEvent* event){
QPainter painter(this);
// 启用反走样功能提高图像质量
painter.setRenderHint(QPainter::Antialiasing, true);
// 物理坐标系与逻辑坐标系的转换,如果不进行该操作,则下面的所有绘图都将基于世界坐标系统来完成。
setWorldTransform(painter);
// 绘制矩形、多边形等示例图形,在应用了上述变换之后这些绘制均在逻辑坐标体系内执行
drawRectScale(painter);
// 可选择性地实现其他绘图功能,如比例缩放和旋转效果。
}
```
将世界坐标的原点(位于视图左上角)转换为新的逻辑坐标系中的位置的函数如下:
```cpp
QPointF QtPixPainter::mapToScene(const QPointF& point){
QTransform transMatrix = _transform.inverted(); //翻转当前变换矩阵以实现逆向映射。
return transMatrix.map(point);
}
```
此方法将给定坐标点(point)根据转换后的逻辑坐标系进行重新定位。
此外,还提供了一个函数用于在鼠标移动事件中返回并展示鼠标的当前位置:
```cpp
void QtPixPainter::mouseMoveEvent(QMouseEvent* event){
QString msg;
QPointF mouse_po = mapToScene(event->pos());
double x = mouse_po.x();
double y = mouse_po.y();
m_mouse_lable->setText(( + QString::number(x) + , + QString::number(y) + ));
}
```
该函数通过调用`mapToScene()`来获取当前鼠标位置的坐标,并以标签形式展示。