一、概述:
1、绘图设备的物理坐标,是最基本的坐标系,原点(0, 0)在左上角,x轴正方向水平向右,y轴正方向竖直向下,单位是像素。
2、视口(Viewport)表示绘图设备的任意一个矩形区域,视口可以让我们只在关心的区域绘图。 定义视口用的是物理坐标,默认情况下视口等于绘图设备的整个矩形区。
3、窗口(Window)和视口是同一个矩形区域,但是窗口使用逻辑坐标系,可以任意指定矩形区域的逻辑坐标范围,长和宽的变化比例不相同也是可以的,窗口坐标原点也可以任意指定。
(1)、默认情况下,窗口坐标范围和视口坐标范围相等,窗口坐标原点在视口左上角,x轴正方向水平向右,y轴正方向竖直向下。
(2)、使用窗口坐标的优点是,只需按窗口的逻辑坐标来绘图,不用管实际的物理坐标范围,并且当视口大小变化时,绘制的图形也会自动变化大小,这样可以将绘图功能与绘图设备隔离,使得绘图功能适用于不同大小、不同类型的设备。
4、QPainter的平移、旋转、缩放,还可以将窗口坐标系变换,得到更容易操作的逻辑坐标。
5、QPainter内部的坐标变换矩阵,自动会将逻辑坐标转换为绘图设备的物理坐标。
二、接口说明:
1、假设绘图设备,宽度300像素,高度200像素。
2、painter.setViewport(50, 0, 200, 200):
表示将绘图设备物理坐标系统的(50, 0)点作为视口的左上角点,取宽度200像素、高度200像素的一个矩形区域,作为视口区域。
3、painter.setWindow(-50, -50, 100, 100):
(1)、窗口区域和视口区域是同一个矩形区域。
(2)、矩形区域的窗口坐标范围(逻辑坐标范围)是宽100、高100,矩形区域左上角点的窗口坐标(逻辑坐标)是(-50, -50),所以这个窗口坐标的原点(0, 0)是在矩形区域的中心。
4、painter.setWindow(0, 0, 200, 100):
(1)、窗口区域和视口区域是同一个矩形区域。
(2)、矩形区域的窗口坐标范围(逻辑坐标范围)是宽200、高100,矩形区域左上角点的窗口坐标(逻辑坐标)是(0, 0),所以这个窗口坐标的原点(0, 0)是在矩形区域的左上角。
三、示例代码:
void Widget::paintEvent(QPaintEvent * event)
{
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing);
int W = width();
int H = height();
int side = std::min(W, H);
QRect rect((W - side) / 2, (H - side) / 2, side, side);
painter.drawRect(rect);
painter.setViewport(rect);
painter.setWindow(-100, -100, 200, 200);
QLinearGradient lineGradient(0, 0, 100, 0);
lineGradient.setColorAt(0, Qt::yellow);
lineGradient.setColorAt(1, Qt::red);
lineGradient.setSpread(QGradient::PadSpread);
painter.setBrush(QBrush(lineGradient));
//设置复合模式,即后面绘制的图与前面绘制的图的叠加模式。
painter.setCompositionMode(QPainter::RasterOp_NotSourceXorDestination);
for(int i = 0; i < 36; i++)
{
painter.drawEllipse(QPoint(50, 0), 50, 50);
painter.rotate(10);
}
}