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);
}
}
效果展示
缩放窗口前的效果

缩放窗口后的效果

浙公网安备 33010602011771号