Qt 视口和窗口的区别

视口和窗口

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

为了实现更方便的坐标,QPainter还提供了视口(Viewport)窗口(Window)坐标系,通过QPainter内部的坐标变换矩阵自动转换为绘图设备的物理坐标

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

窗口与视口是同一个矩形,只不过是用逻辑坐标定义的坐标系。窗口可以直接定义矩形区的逻辑坐标范围

  • 不添加视口与窗口
cpp 复制代码
#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
}

Widget::~Widget()
{
    delete ui;
}

void Widget::paintEvent(QPaintEvent* event){
    QPainter painter(this);
    int width = this->width();
    int height = this->height();
    QRect rect(width/4,height/4,width/2,height/2);

    // painter.setViewport(width/2,height/2,width/2,height/2);
    // painter.setWindow(width/2,height/2,width,height);

    QPen pen;
    pen.setWidth(3);
    pen.setColor(Qt::blue);
    pen.setStyle(Qt::SolidLine);
    pen.setCapStyle(Qt::FlatCap);
    pen.setJoinStyle(Qt::BevelJoin);
    painter.setPen(pen);

    QBrush brush;
    brush.setColor(Qt::green);
    brush.setStyle(Qt::SolidPattern);
    painter.setBrush(brush);

    painter.drawRect(rect);
}
  • 添加视口

选择右下角四分之一区域作为视口

cpp 复制代码
painter.setViewport(width/2,height/2,width/2,height/2);
  • 添加窗口
cpp 复制代码
painter.setWindow(-width/2,-height/2,width,height);

更改窗口大小

cpp 复制代码
painter.setWindow(-width/2,-height/2,width/2,height/2);

这里思考一下窗口的起点坐标和窗口的大小,自然明白此处为什么不显示矩形

💡 视口与窗口实际上是同一区域,视口使用的是物理坐标,窗口使用的是逻辑坐标

使用窗口坐标的优点是,只需按照窗口坐标定义来绘图,而不用管实际的物理坐标范围的大小。例如在一个固定边长为100的正方形窗口内绘图,当实际绘图设备大小变化时,绘制的图形会自动变化大小。这样,就可以将绘图功能与绘图设备隔离开来,使得绘图功能适用于不同大小、不同类型的设备

相关推荐
暮乘白帝过重山4 小时前
ArkTS ForEach 参数解析:组件与键值生成器
开发语言·数据库
LiamTuc4 小时前
Java构造函数
java·开发语言
三途河畔人4 小时前
Pytho基础语法_运算符
开发语言·python·入门
Benmao⁢4 小时前
C语言期末复习笔记
c语言·开发语言·笔记·leetcode·面试·蓝桥杯
adsadswee4 小时前
Qt 样式与 QLinearGradient 渐变详解
开发语言·qt·qt样式表·qlineargradient·qss渐变效果
花月C5 小时前
个性化推荐:基于用户的协同过滤算法
开发语言·后端·算法·近邻算法
脾气有点小暴5 小时前
前端页面跳转的核心区别与实战指南
开发语言·前端·javascript
rit84324995 小时前
基于MATLAB的BP神经网络手写数字识别
开发语言·神经网络·matlab
feiyangqingyun5 小时前
Qt优化onvif设备搜索/一键批量搜索/onvif设备模拟器/几千路并发/实时推流/虚拟监控摄像头
qt·onvif模拟器
San30.6 小时前
深入 JavaScript 内存机制:从栈与堆到闭包的底层原理
开发语言·javascript·udp