绘图设备的物理坐标是基本的坐标系,通过QPainter平移 旋转等变换可以得到更容易操作的逻辑坐标

视口: 绘图设备的任意一个矩形区域的物理坐标,可以只选取物理坐标的一个矩形区域用于绘图。视口默认情况下等于绘图设备的整个矩形区。

            QPaintset::setViewport(int x , int y, int width ,int height)定义视口

窗口: 对应于视口的矩形区域,只不过是用逻辑坐标定义的坐标系,窗口坐标的中心在矩形中心

           QPaintset::setWindow(int x , int y, int width ,int height)

 

 1 #include "viewport.h"
 2 #include "ui_viewport.h"
 3 #include <QPainter>
 4 #include <QPen>
 5 #include <QBrush>
 6 #include <QtMath>
 7 #include <QLinearGradient>
 8 viewport::viewport(QWidget *parent) :
 9     QWidget(parent),
10     ui(new Ui::viewport)
11 {
12     ui->setupUi(this);
13     setWindowTitle("视口和窗口");
14 }
15 
16 viewport::~viewport()
17 {
18     delete ui;
19 }
20 
21 void viewport::paintEvent(QPaintEvent *event)
22 {
23     QPainter painter(this);
24     int w = width();
25     int h = height();
26     int side = qMin(w,h);
27     QRect rect((w-side)/2,(h-side)/2,side,side);
28     painter.drawRect(rect);
29     painter.setViewport(rect);            // 设置ViewPort
30     painter.setWindow(-100,-100,200,200); // 设置窗口 逻辑坐标
31     painter.setRenderHint(QPainter::Antialiasing);
32 
33     QPen pen;
34     pen.setWidth(2);
35     pen.setColor(Qt::red);
36     pen.setStyle(Qt::SolidLine);
37     painter.setPen(pen);
38 
39     QLinearGradient linerGrad(0,0,100,0);
40     linerGrad.setColorAt(0,Qt::yellow);
41     linerGrad.setColorAt(1,Qt::green);
42     linerGrad.setSpread(QGradient::PadSpread);
43     painter.setBrush(linerGrad);
44 
45     //设置复合模式
46     painter.setCompositionMode(QPainter::RasterOp_SourceXorDestination);
47 
48     for(int i = 0 ; i < 36 ; i++)
49     {
50         painter.drawEllipse(QPoint(50,0),50,50);
51         painter.rotate(10);   //画完一个圆以后坐标系旋转10度
52 
53     }
54 }

不同叠加参数可以获取不同的图

posted on 2019-10-19 18:36  AmyBKLP  阅读(1298)  评论(0编辑  收藏  举报