繪圖設備的物理坐標是基本的坐標系,通過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 }

不同疊加參數可以獲取不同的圖
