绘图设备的物理坐标是基本的坐标系,通过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 }
不同叠加参数可以获取不同的图