绘图设备的物理坐标是基本的坐标系,通过QPainter的平移,旋转等变换可以得到更容易操作的逻辑坐标。
而为了实现更方便的坐标,QPainter还提供了视口和窗口坐标系,通过QPainter内部坐标的变换矩阵自动转换为
绘图设备的物理坐标系。
视图表示绘图设备的任意一个矩形区域的物理坐标,可以只选取物理坐标的一个矩形区域用于绘图。默认情况下,视图等于绘图设备的整个矩形区域。
窗口与视图是同一个矩形,只不过使用逻辑坐标的坐标系。窗口可以直接定义矩形区的逻辑坐标范围。
代码示例:在绘图事件中重写
//视口和窗口
QPainter painter(this);
int w=width();
int h=height();
//取长和宽的较小值
int side=qMin(w,h);
//视口矩形区域
QRect rect((w-side)/2,(h-side),side,side);
//设置视口
painter.setViewport(rect);
//设置窗口大小,逻辑坐标
painter.setWindow(-100,-100,200,200);
painter.setRenderHint(QPainter::Antialiasing);
//设置画笔
QPen pen;
//画笔线宽
pen.setWidth(1);
//画笔颜色
pen.setColor(QColor(242,158,194));
//线的类型
pen.setStyle(Qt::SolidLine);
painter.setPen(pen);
for(int i=0;i<36;i++)
{
painter.drawEllipse(QPoint(50,0),50,50);
painter.rotate(10);
}
效果图
绘图叠加:在上面的代码中我们加入几行代码使其达成如上叠加效果
使用QPainter::setCompositionMode()函数设置组合模式,既后面绘制的图与前面绘制的图的叠加模式。函数参术是一个QPainter::CompositonMode枚举类型值,将近有40种取值,详情可查帮助文档
QPainter painter(this);
int w=width();
int h=height();
//取长和宽的较小值
int side=qMin(w,h);
//视口矩形区域
QRect rect((w-side)/2,(h-side),side,side);
//设置视口
painter.setViewport(rect);
//设置窗口大小,逻辑坐标
painter.setWindow(-100,-100,200,200);
painter.setRenderHint(QPainter::Antialiasing);
//设置画笔
QPen pen;
//画笔线宽
pen.setWidth(1);
//画笔颜色
pen.setColor(QColor(242,158,194));
//线的类型
pen.setStyle(Qt::SolidLine);
//线性渐变
QLinearGradient linearGrad(0,0,100,0);
//起点颜色
linearGrad.setColorAt(0,QColor(242,158,194));
//终点颜色
linearGrad.setColorAt(0,Qt::green);
//展布模式
linearGrad.setSpread(QGradient::PadSpread);
//设置画刷
painter.setBrush(linearGrad);
//设置复合模式
painter.setCompositionMode(QPainter::RasterOp_NotSourceXorDestination);
painter.setPen(pen);
for(int i=0;i<36;i++)
{
painter.drawEllipse(QPoint(50,0),50,50);
painter.rotate(10);
}