- 第一个是原始五角星
- 第二个五角星缩小为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()函数
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“文本 }