QT坐标系统和坐标变换
QT坐标系统和坐标变换
为了绘图的方便,QPainter提供了一些坐标变换的功能,通过平移、旋转、缩放等坐标的变换,得到一个逻辑坐标系统,使用逻辑坐标系统在某些时候绘图更方便
QPainterPath的使用并体现坐标变换
代码实现
#include "MyWidget.h"
#include <QPainter>
#include <qmath.h>
MyWidget::MyWidget(QWidget *parent)
: QWidget(parent)
{
}
MyWidget::~MyWidget()
{}
void MyWidget::paintEvent(QPaintEvent* event)
{
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing);//开启图形抗锯齿
painter.setRenderHint(QPainter::TextAntialiasing);//开启文本抗锯齿
//生成五角星的5个顶点坐标,假设原点在五角星中心
qreal R = 100; //半径
const qreal Pi = 3.14159;
qreal deg = Pi * 72 / 180;//
QPoint points[5] = { //针对Qt 5.12.1 编译错误修改,使用<Qtmath>中的函数 qSin(), qCos()
QPoint(R,0),
QPoint(R * qCos(deg), -R * qSin(deg)),
QPoint(R * qCos(2 * deg), -R * qSin(2 * deg)),
QPoint(R * qCos(3 * deg), -R * qSin(3 * deg)),
QPoint(R * qCos(4 * deg), -R * qSin(4 * deg))
};
//设置字体
QFont font;
font.setPointSize(12);
font.setBold(true);
painter.setFont(font);
//设置画笔
QPen penLine;
penLine.setWidth(2);//显宽
penLine.setColor(Qt::blue);//画线颜色
penLine.setStyle(Qt::SolidLine);//线的类型
penLine.setCapStyle(Qt::FlatCap);//线端点样式
penLine.setJoinStyle(Qt::BevelJoin);//线的连接点样式
painter.setPen(penLine);
//设置画刷
QBrush brush;
brush.setColor(Qt::yellow);//画刷颜色
brush.setStyle(Qt::SolidPattern);//画刷填充样式
painter.setBrush(brush);
//设计绘制五角星的PainterPaht,以便重复使用
QPainterPath starPath;
starPath.moveTo(points[0]);
starPath.lineTo(points[2]);
starPath.lineTo(points[4]);
starPath.lineTo(points[1]);
starPath.lineTo(points[3]);
starPath.closeSubpath();//闭合路径,最后一个点与第一个点相连
starPath.addText(points[0], font, "0");
starPath.addText(points[1], font, "1");
starPath.addText(points[2], font, "2");
starPath.addText(points[3], font, "3");
starPath.addText(points[4], font, "4");
//绘图
painter.save();//保存坐标状态
painter.translate(100, 120);//平移
painter.drawPath(starPath);//画星星
painter.drawText(0, 0, "S1");
painter.restore();//恢复坐标状态
painter.translate(300, 120);//平移
painter.scale(0.8, 0.8);//缩放
painter.rotate(90);//顺时针旋转90度
painter.drawPath(starPath);//画星星
painter.drawText(0, 0, "S2");
painter.resetTransform();//复位所有坐标变换
painter.translate(500, 120);//平移
painter.rotate(-145);//逆时针旋转145度
painter.drawPath(starPath);//画星星
painter.drawText(0, 0, "S3");
}
运行效果

浙公网安备 33010602011771号