QT项目:06---QPainter绘图之(QPainterPath绘图与坐标转换)

  • 本案例基础语法来自于文章:https://blog.csdn.net/qq_41453285/article/details/100040518、https://blog.csdn.net/qq_41453285/article/details/100046564

QT项目:06---QPainter绘图之(QPainterPath绘图与坐标转换)_第1张图片

  • 第一个是原始五角星
  • 第二个五角星缩小为0.8倍,顺时针旋转90度
  • 第三个逆时针旋转145度

第一步:

  • 创建一个基于QWidget的窗口

第二步:

  • 书写构造函数
Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    
    setPalette(QPalette(Qt::white)); //设置窗口背景色
    setAutoFillBackground(true);
    resize(600,300);  //设置窗口的初始化大小
}

第三步:

  • 重写paintEvent()函数

QT项目:06---QPainter绘图之(QPainterPath绘图与坐标转换)_第2张图片

void Widget::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);
    painter.setRenderHint(QPainter::TextAntialiasing);

    qreal R=100;  //五角星内接圆半径100
    const qreal Pi=3.14159;
    qreal deg=Pi*72/180;
    //生成五角星的5个顶点的坐标,假设原点在五角星的中心
    QPoint points[5]={
        QPoint(R,0),
        QPoint(R*std::cos(deg),-R*std::sin(deg)),
        QPoint(R*std::cos(2*deg),-R*std::sin(2*deg)),
        QPoint(R*std::cos(3*deg),-R*std::sin(3*deg)),
        QPoint(R*std::cos(4*deg),-R*std::sin(4*deg)),
    };

    //设置字体
    QFont font;
    font.setPointSize(12);//字体大小
    font.setBold(true);//粗体

    //设置画笔
    QPen penLine;
    penLine.setWidth(2);  //线宽
    penLine.setColor(Qt::blue); //线颜色
    penLine.setStyle(Qt::SolidLine);//线的类型
    penLine.setCapStyle(Qt::FlatCap);//线断点样式
    penLine.setJoinStyle(Qt::BevelJoin);//线的连接点样式

    //设置画刷
    QBrush brush;
    brush.setColor(Qt::yellow);      //画刷颜色
    brush.setStyle(Qt::SolidPattern);//画刷填充样式

    //将字体、画笔、画刷都添加进painter对象中
    painter.setFont(font);
    painter.setPen(penLine);
    painter.setBrush(brush);

    QPainterPath starPath;
    starPath.moveTo(points[0]);//画图路径的起点
    starPath.lineTo(points[2]);//向points[2]画线
    starPath.lineTo(points[4]);//向points[4]画线
    starPath.lineTo(points[1]);//向points[1]画线
    starPath.lineTo(points[3]);//向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");//在中心(起点)添加”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");//在中心(起点)添加”S2“文本

    //绘制第三个五角星
    painter.resetTransform(); //复位所有坐标变换
    painter.translate(500,120);//平移
    painter.rotate(-145);//逆时针旋转145度
    painter.drawPath(starPath);//开始绘制五角星
    painter.drawText(0,0,"S3");//在中心(起点)添加”S3“文本
}

 

你可能感兴趣的:(QT项目)