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");
}

运行效果

image

posted @ 2025-11-02 18:25  焦涛  阅读(34)  评论(0)    收藏  举报