Qt第十六天’

坐标变换

坐标平移
坐标旋转
坐标缩放
状态的保存和恢复

widget.h

#ifndef WIDGET_H
#define WIDGET_H


#include <QWidget>


namespace Ui {
class Widget;
}


class Widget : public QWidget
{
Q_OBJECT
protected:
    void paintEvent(QPaintEvent *event) Q_DECL_OVERRIDE;


public:
explicit Widget(QWidget *parent = nullptr);
~Widget();


private:
Ui::Widget *ui;
};


#endif // WIDGET_H


widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include<QPainter>
#include<stdlib.h>
#include<math.h>
#include<iostream>


Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
setPalette(QPalette(Qt::white));
setAutoFillBackground(true);
resize(600,500);//初始化窗口大小
}


Widget::~Widget()
{
delete ui;
}
void Widget::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    painter.setRenderHints(QPainter::Antialiasing|QPainter::TextAntialiasing);//抗锯齿
    //生成五角星顶点坐标,假设原点在五角星中心
    qreal R=100;
    const qreal Pi=3.1415;
    qreal deg=Pi*72/180;
    QPointF points[5]=//将点的坐标设为float型
    {
        QPointF(R,0),
        //需要添加头文件#include<iostream>和#include<math.h>
        QPointF(R*std::cos(deg),-R*std::sin(deg)),
        QPointF(R*std::cos(2*deg),-R*std::sin(2*deg)),
        QPointF(R*std::cos(3*deg),-R*std::sin(3*deg)),
        QPointF(R*std::cos(4*deg),-R*std::sin(4*deg))
    };
    //设置字体
    QFont font;
    font.setPointSize(12);
    font.setBold(true);
    painter.setFont(font);
    //设置画笔
    QPen pen;
    pen.setWidth(2);
    pen.setColor(Qt::black);
    pen.setStyle(Qt::SolidLine);
    pen.setCapStyle(Qt::RoundCap);
    pen.setJoinStyle(Qt::RoundJoin);
    painter.setPen(pen);
    //设置画刷
    QBrush brush;
    brush.setColor(Qt::red);
    brush.setStyle(Qt::Dense1Pattern);
    painter.setBrush(brush);
    //设计绘制五角星的PainterPath
    QPainterPath painterPath;
    painterPath.moveTo(points[0]);
    painterPath.lineTo(points[2]);
    painterPath.lineTo(points[4]);
    painterPath.lineTo(points[1]);
    painterPath.lineTo(points[3]);
    painterPath.closeSubpath();//闭合路径
    //在顶点显示编号
    painterPath.addText(points[0],font,"0");
    painterPath.addText(points[1],font,"1");
    painterPath.addText(points[2],font,"2");
    painterPath.addText(points[3],font,"3");
    painterPath.addText(points[4],font,"4");
    //绘图
    painter.save();//保存坐标
    painter.translate(100,120);//平移
    painter.drawPath(painterPath);//绘图
    painter.drawText(0,0,"S1");//在现在的原点写字
    //painter.restore();//恢复坐标状态


    painter.resetTransform();//复位坐标变换
    painter.translate(300,120);//平移
    painter.scale(0.8,0.8);//缩小至0.8
    painter.drawPath(painterPath);
    painter.drawText(0,0,"S2");


    painter.resetTransform();
    painter.translate(500,120);
    painter.rotate(180);//旋转
    painter.drawPath(painterPath);
    painter.drawText(0,0,"S3");


/*  for(int i=0;i<30;i++)
    {
        painter.rotate(3);
        painter.drawPath(painterPath);
    }
*/
}


运行结果
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/theRookie1/article/details/85004235