QT中的视口和窗口

视口和窗口

视口:绘制设备的任意一个矩形区域的物理坐标,可以只选取物理坐标的一个矩形区域用于绘图,视口默认情况下等于绘图设备的整个矩形区
窗口:对应于视口的矩形区域,只不过时用逻辑坐标定义的坐标系,窗口坐标的中心在矩形中心。使用窗口坐标绘制,不用管实际的物理大小。

代码举例实现

#include "MyWidget.h"
#include <QPainter>

MyWidget::MyWidget(QWidget *parent)
    : QWidget(parent)  
{
}

MyWidget::~MyWidget()
{}

void MyWidget::paintEvent(QPaintEvent* event)
{
    QPainter  painter(this);
    int W = width();
    int H = height();
    int length = qMin(W, H);//取长和宽的较小值
    QRect rect((W - length) / 2, (H - length) / 2, length, length);//viewpont矩形区域    
    painter.drawRect(rect);//Viewport的矩形区域
    QFont font;
    font.setPointSize(20);
    painter.setFont(font);
   
    painter.setViewport(rect);//设置Viewport
     
   //下面设置具体起点和长宽好像只是在初始化用到,后面缩放视乎没有起不到作用?这里需要继续弄清楚
    painter.setWindow(-100, -100, 200, 200);//设置窗口大小,逻辑坐标.定义的窗口时原点在中心,边长为200的正方形。
    
    //设置画笔
    QPen pen;
    pen.setWidth(1);//线宽
    pen.setColor(Qt::red);//划线颜色
    pen.setStyle(Qt::SolidLine);//线的类型
    painter.setPen(pen);

    //线性渐变填充
    QLinearGradient linearGrad(0, 0, 100, 0);//从左到右
    linearGrad.setColorAt(0, Qt::yellow);//起点颜色
    linearGrad.setColorAt(1, Qt::green);//终点颜色
    linearGrad.setSpread(QGradient::PadSpread);//展布模式
    painter.setBrush(linearGrad);

    //设置叠加效果的复合模式
    painter.setCompositionMode(QPainter::RasterOp_NotSourceXorDestination);
    //painter.setCompositionMode(QPainter::CompositionMode_Difference);
    //painter.setCompositionMode(QPainter::CompositionMode_Exclusion);

    //绘制36个圆,每个圆的圆心在X轴上的(50,0),半径为50,画玩一个圆后坐标系旋转10度
    //再画相同的圆。这就巧妙应用了坐标轴的旋转。
    for (int i = 0;i < 36;i++)
    {
        painter.drawEllipse(QPoint(50, 0), 50, 50);
        painter.rotate(10);
    }
}

效果展示

缩放窗口前的效果

image

缩放窗口后的效果

image

posted @ 2025-11-02 16:24  焦涛  阅读(18)  评论(0)    收藏  举报