2D绘图--视口窗口setViewport setWindow

目录

1 setViewport setWindow

2 示例

3 实际应用(个人理解)

4 总结


1 setViewport setWindow

        在Qt中,QPaintersetViewport()方法用于定义绘图区域在窗口坐标系中的可视部分。

QPainter::setWindow() 是 Qt 库中 QPainter 类的一个方法,用于定义绘图区域的大小和位置。

setViewport()setWindow()方法一起使用,以控制绘图的缩放和裁剪。

        可以通过先设置视口,再设置对应的窗口的方法,来确保我们的代码在标准的想象中的坐标

系中绘制的图形,可以准确地显示在不同的绘图设备界面上。

2 示例
void MainWindow::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    int width = this->width();
    int hight = this->height();
    int view_x = width / 4;
    int view_y = hight / 4;
    int side = hight / 2;
    qDebug()<<"width:"<<width<<"hight:"<<hight;
    qDebug()<<"view_x:"<<view_x<<"view_y:"<<view_y<<"side:"<<side;
    painter.setPen(Qt::black);
    painter.drawRect(view_x,view_y,side,side);
    painter.setViewport(view_x,view_y,side,side);


    painter.setWindow(-100,-100,200,200);
    painter.setPen(Qt::red);
    QBrush brush(Qt::red);
    painter.setBrush(brush);
    painter.drawRect(0,0,100,100);
    
}

执行结果:

 代码说明:

        打印输出

width: 400 hight: 300
view_x: 100 view_y: 75 side: 150

(1)painter.setViewport(view_x,view_y,side,side);

用于定义绘图区域的大小和位置 实际值为painter.setViewport(100,75,150,150);

        即起点(100,75)长宽150的绘图区域 

为方便观察 painter.drawRect(view_x,view_y,side,side);绘制出了这一区域 即黑色方框

(2)painter.setWindow(-100,-100,200,200);定义你想要绘制的大小。

        具体来说 是有一个映射关系 即点(-100,-100)与视口的(0,0)点对应就是黑色方框的左

上角,宽和长也和视口一一映射对应,有一定的比例关系

        所以绘图时计算设置的setWindow窗口坐标就行 窗口黑色方框左上角(-100,-100),右下角(100,100)

        此时painter.drawRect(0,0,100,100);的起始点(0,0)就对应的是窗口的中心 绘制出来如上图所示

(3)如果想在方框的右上角开始画

painter.setWindow(-200,0,200,200);

        此时方框的右上角坐标就是(0,0)

(也可以保持painter.setWindow(-100,-100,200,200)不变,改变绘制坐标painter.drawRect(100,-100,100,100)也是一样的效果)

绘制如下

3 实际应用(个人理解)

比如代码如下

void MainWindow::paintEvent(QPaintEvent *)
{
    //我的初始窗口的大小width=400 hight=300
    QPainter painter(this);
    int width = this->width();
    int hight = this->height();

    painter.setPen(Qt::black);
    painter.drawRect(0,0,width,hight);
    painter.setViewport(0,0,width,hight);

    painter.setWindow(0,0,400,300);
    painter.setPen(Qt::red);
    QBrush brush(Qt::red);
    painter.setBrush(brush);
    painter.drawRect(0,0,200,150);

}

我绘制了1/4大小的红色矩形,无论窗口怎样变化,红色矩形始终占了窗口的 1/4,这里的窗口可以

模拟为设备,即在不同屏幕大小的设备上所占的比例不变。

4 总结

(1)视口定义显示区域,和setWindow窗口有一定的映射关系,设置好窗口的坐标系后,后续绘

制就按照窗口坐标系绘制即可

(2)可以通过先设置视口,再设置对应的窗口的方法,可以准确地显示在不同的绘图设备界面上。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/313884.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

字体包大小缩小的软件

Fontmin - 字体子集化方案https://ecomfe.github.io/fontmin/#app

Talk|南洋理工大学王谭:DisCo-基于解耦控制的现实人物舞蹈生成及相关工作梳理

本期为TechBeat人工智能社区第563期线上Talk。 北京时间1月11日(周四)20:00&#xff0c;南洋理工大学博士生—王谭的Talk已准时在TechBeat人工智能社区开播&#xff01; 他与大家分享的主题是: “DisCo-基于解耦控制的现实人物舞蹈生成及相关工作梳理”&#xff0c;介绍了他的团…

服务器架构演进史

服务器架构演进史 概述 在进行后端的学习过程中&#xff0c;有时由于个人的学习广度的局限导致无法从全局理解一些概念&#xff0c;服务端的架构的演进历史&#xff0c;同时列举出每个演进阶段会遇到的相关技术&#xff0c;让对架构的演进有一个整体的认知。并帮助读者与本人…

考研英语高频打卡

高频词汇13——15抽背答案 1、colleague /ˈkɒliːɡ/ 考频20&#xff08;英一12 次&#xff0c;英二8 次&#xff09; n. 同事&#xff0c;同僚 2、despite /dɪˈspaɪt/ 考频19&#xff08;英一12 次&#xff0c;英二7 次&#xff09; prep. 不管&#xff0c;不顾 3、overa…

SwiftUI 为任意视图加上徽章(Badge)而想到的(上)

概览 在小伙伴们看来为 SwiftUI 视图添加徽章是一件轻松愉快的“消遣”,几乎不费吹灰之力。但随着需求的升级实现难度可能会“陡然而升”。 从上面演示图中可以看到:无论徽章中的数字是多少、无论徽章采用什么样的偏移方式,徽章的显示都“得体大方、游刃有余”,这是怎么做…

asp.net core项目发布到 iis上

我们都知道与传统asp.net 项目比较&#xff0c;ASP.NET Core则完全不同&#xff0c;它并不是运行在IIS的工作进程中&#xff0c;而是独立运行的。它运行于控制台应用程序之中&#xff0c;控制台中则运行了Kestrel Web服务器组件。Kestrel作为一款.NET Web服务器的实现&#xff…

2024年甘肃省职业院校技能大赛信息安全管理与评估 样题二 模块二

竞赛需要完成三个阶段的任务&#xff0c;分别完成三个模块&#xff0c;总分共计 1000分。三个模块内容和分值分别是&#xff1a; 1.第一阶段&#xff1a;模块一 网络平台搭建与设备安全防护&#xff08;180 分钟&#xff0c;300 分&#xff09;。 2.第二阶段&#xff1a;模块二…

少儿编程 中国电子学会图形化编程2023年12月等级考试Scratch二级真题解析(选择题、判断题)

一、选择题&#xff1a;共25小题&#xff0c;每题2分&#xff0c;共50分 1.在制作推箱子游戏时&#xff0c;地图是用数字形式储存在电脑里的&#xff0c;下图是一个推箱子地图&#xff0c;地图表示如下&#xff1a; 第一行 (111111) 第二行(132231) 第三行(126621)第四行(第五…

AnyText多语言文字生成与编辑模型——让AI绘图自由添加精美文字

随着AIGC的爆火,图片生成技术得到飞速发展,当前AI生成的图片已达到真假难辨的高保真度。例如stable diffusion与midjourney为代表的文生图大模型。不过,当合成图片中出现文字内容时,现存的AI技术依然无法驾驭文字内容。因此,modescope提出了一种新型的文字生成方法,此方法…

stl中的list模拟实现

目录 一、list的简单介绍二、写出节点的代码三、模拟实现迭代器&#xff08;重点&#xff09;1、list中的迭代器是怎么实现的2、编写iterator类的代码3、对const_iterator进行理解4、编写const_iterator类的代码5、对iterator类和const_iterator类进行合并 四、list类进行代码实…

MC-4/11/10/400​什么是电机驱动器。​

MC-4/11/10/400​什么是电机驱动器。​ 首先&#xff0c;我们先来了解以下两个主题&#xff0c;这会帮助我们了解什么是电机驱动器。 电机驱动器IC的作用 电机驱动器IC与电机设备之间的关系 电机驱动器的作用 用来使电机旋转&#xff08;驱动电机&#xff09;的集成电路&…

d2l动手学深度学习】 Lesson 13 Dropout层 老板随机丢掉一些做项目的程序员‍,项目的效果会更好!(bushi)

文章目录 1. 什么是Dropout老板随机丢掉一些做项目的程序员&#x1f9d1;‍&#x1f4bb;&#xff0c;项目的效果会更好&#xff01; 2. 代码实现&#xff08;不用torch&#xff09;3. 代码实现&#xff08;使用torch&#xff09;3. 调节实验3.1 老师上课所设置的dropout1, dro…

【二十】【动态规划】879. 盈利计划、377. 组合总和 Ⅳ、96. 不同的二叉搜索树 ,三道题目深度解析

动态规划 动态规划就像是解决问题的一种策略&#xff0c;它可以帮助我们更高效地找到问题的解决方案。这个策略的核心思想就是将问题分解为一系列的小问题&#xff0c;并将每个小问题的解保存起来。这样&#xff0c;当我们需要解决原始问题的时候&#xff0c;我们就可以直接利…

【Python】数据可视化--基于TMDB_5000_Movie数据集

一、数据准备 tmdb_5000_movie数据集下载 二、数据预处理 观察数据集合情况 import pandas as pd import ast import warnings warnings.filterwarnings(ignore) # 加载数据集 df pd.read_csv(tmdb_5000_movies.csv) # 查看数据集信息 print(df.info()) 由于原数据集包含的…

2024 年 DevOps 会是什么样子?

过去两年的特点是科技公司大幅裁员。随着亚马逊、Meta 和谷歌等公司的大规模裁员成为各大头条新闻&#xff0c;科技行业在疫情期间释放资本并实现强劲增长&#xff0c;这种“花钱、快速增长”的思维模式正在发生普遍转变。游戏的名称是在支出上更加保守&#xff0c;这种心态将推…

flask web服务器:运行在云服务器上的最简单的web服务器

上期文章我们分享了flask的基础知识以及如何安装flask&#xff0c;当你安装完成flask后&#xff0c;我们就可以打造自己的web服务器了。 首先我们打印最简单的hello world,并在浏览器中显示 from flask import Flask app Flask(__name__)app.route(/) def index():return he…

C++_虚函数表

虚函数表 介绍源码运行结果笔记扩充函数名联编静态联编动态联编 介绍 1.编译器通过指针或引用调用虚函数&#xff0c;不会立即生成函数调用指令&#xff0c;而是用 二级函数指针 代替 1.1确定真实类型 1.2找到虚函数表从而找到入口地址 1.3根据入口地址调用函数(PS:俗称 函数指…

SQL-数据类型

&#x1f389;欢迎您来到我的MySQL基础复习专栏 ☆* o(≧▽≦)o *☆哈喽~我是小小恶斯法克&#x1f379; ✨博客主页&#xff1a;小小恶斯法克的博客 &#x1f388;该系列文章专栏&#xff1a;重拾MySQL &#x1f379;文章作者技术和水平很有限&#xff0c;如果文中出现错误&am…

数据结构初阶之插入排序与希尔排序详解

个人主页&#xff1a;点我进入主页 专栏分类&#xff1a;C语言初阶 C语言程序设计————KTV C语言小游戏 C语言进阶 C语言刷题 数据结构初阶 Linux 欢迎大家点赞&#xff0c;评论&#xff0c;收藏。 一起努力,共赴大厂。 目录 一.前言 二.插入排序 …

代码随想录 Leetcode203. 移除链表元素

题目&#xff1a; 代码(首刷看解析 2024年1月11日&#xff09;&#xff1a; class Solution { public:ListNode* removeElements(ListNode* head, int val) {if(headnullptr) return nullptr;ListNode* BeforeHead new ListNode(0,head);ListNode* temp BeforeHead;while(te…