qt的坐标变换函数:
为了绘图的方便,QPainter提功了一些坐标变换的功能,通过平移,旋转等坐标变换,得到一个逻辑坐标系统,使用逻辑坐标系统在某些时候绘图更方便。
QPainter有关坐标变换操作的函数:
分组 函数原型 功能
坐标变换 void translate(qreal dx,qreal dy) 坐标系统一定的偏移量,坐标原点平移到新的点
void rotate(qreal angle) 坐标系统顺时针旋转一个角度
void scale(qreal sx,qreal sy) 坐标系统缩放
void shear(qrael sh,qreal sy) 坐标系统做扭转变换
状态保存与恢复 void save() 保存painter当前的状态,就是将当前状态压入栈
void restore() 恢复上一次状态,就是从堆栈中弹出上次的状态
void resetTransform() 复位所有的坐标变换
实例:
在widget的头文件中声明:protected: void paintEvent(QPaintEvent *event);
绘图时件中的代码:
QPainter painter(this);
//指定渲染的模式
//QPainter::Antialiasing=抗锯齿
//QPainter::TextAntialiasing=绘制的字体抗锯齿
painter.setRenderHint(QPainter::Antialiasing);
painter.setRenderHint(QPainter::TextAntialiasing);
//生成五角星的五个顶点的坐标,假设原点在五角星
qreal R=100;//半径
const qreal Pi=3.1415926;
qreal deg=Pi*72/180;
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);
//画家使用该字体
painter.setFont(font);
//设置画笔
QPen penLine;
//设置画笔线宽
penLine.setWidth(2);
//设置画线颜色
penLine.setColor(Qt::blue);
//设置线的类型
penLine.setStyle(Qt::SolidLine);
//设置线的端点样式
penLine.setJoinStyle(Qt::BevelJoin);
//画家使用画笔
painter.setPen(penLine);
//设置画刷
QBrush brush;
//设置画刷颜色
brush.setColor(Qt::yellow);
//画刷填充样式
brush.setStyle(Qt::SolidPattern);
//设计绘制五角星的painterPath,已重复使用
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[0],font,"1");
starPath.addText(points[0],font,"2");
starPath.addText(points[0],font,"3");
starPath.addText(points[0],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);
//顺时针旋转90度
painter.rotate(90);
//画第二个星星
painter.drawPath(starPath);
//设置文本
painter.drawText(0,0,"S2");
//复位所有坐标变换
painter.resetTransform();
//平移
painter.translate(500,120);
//逆时针旋转-145度
painter.rotate(-145);
//画星星
painter.drawPath(starPath);
//设置文本
painter.drawText(0,0,"S3");