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);
}
*/
}
运行结果