Qt中QGraphics绘图类相关解释

Item(图元)坐标系、Scene(场景)坐标系、View(视图)坐标系,三者均为:x轴正方向向右,y轴正方向向下

1、Item(图元):坐标属于局部坐标,通常以图元中心为原点(中心对称)。

        场景坐标系统描述了顶层的图元,每个图元都有场景坐标和相应的包容框。

        Item有setPos成员函数,设置的是父类坐标系的坐标,即此Item原点在Scene中所处的坐标。有scenePos成员函数,获取到的是setPos的设置值,默认是(0, 0)。

        QGraphicsItemGroup是Qt框架中的一个类,它允许开发者将多个QGraphicsItem对象组合成一个单一的项。这种组合可以简化对这些项的操作,例如一起移动、旋转或缩放它们。QGraphicsItemGroup非常适合于那些需要将多个图形元素视为一个整体进行管理的场景,比如在绘图应用程序或游戏开发中。

2、Scene(场景):坐标属于逻辑坐标logical coordinates(与QPainter相同),以场景中心为原点

        Sence构造函数可以不带参,例如QGraphicsScene scene;可以带参,例如QGraphicsScene scene(-400, -300, 800, 600),这样定义的 scene 是左上角坐标为(-400, -300),宽度为800,高度为600 的矩形区域,单位是像素。或者可以直接使用成员函数setSceneRect设置。

3、View(视图):坐标属于设备坐标device coordinates(与窗口相同),默认以左上点为原点

        QGraphicsView类继承自QWidget类,因此它与其他的QWidget类一样,以窗口的左上角作为自己坐标系的原点。

        测试发现:默认场景坐标原点与视图窗口中心对齐显示。默认视图窗口不出现滚动条,当设置的场景尺寸大于视图窗口尺寸时,出现滚动条。

4、Scene 的坐标原点与View的坐标原点之间的关系

        如果设置为:_graphicsView->setAlignment(Qt::AlignLeft | Qt::AlignTop);,没有下面这句话:_graphicsSence->setSceneRect(-100,-100,100,100);。那么scene 的坐标原点与view的坐标原点重合。

        如果有下面那句话,那么view的坐标原点是 scene 的(-100,-100)。

        如果设置为默认的_graphicsView->setAlignment(Qt::AlignCenter);,会尽量将scene中的item作为一个组合整体。然后找到这个组合整体的重心,放在view窗体的中心。scene的原点,相对偏移。

        如果没有setSceneRect,那么默认的sceneRect长宽是包含的图元的宽和高。如果有设置setSceneRect:如果设置的Rect比图元还小,那么默认(图元不设置坐标)图元与场景左上对齐,然后视图默认居中情况下,居中的是场景,而非图元;如果设置的Rect比图元大,那么默认(图元不设置坐标)亦图元与场景左上对齐,然后视图默认居中情况下,居中的是场景,而非图元。

5、总结

        可以这样简单理解:默认Scene跟Item一样大,显示到View中时Scene居中(Item默认亦会居中)。当设置SceneRect后,Item在Scene中左上对齐。当设置View的Alignment后,Scene显示到View中时按Alignment显示。

        如果要自定义位置显示,那么Item或ItemGroup要设置SetPos。

        附一些测试代码:

//#include "mainwindow.h"
//#include <QApplication>//int main(int argc, char *argv[])
//{
//    QApplication a(argc, argv);
//    MainWindow w;
//    w.show();
//    return a.exec();
//}#include <QApplication>
#include <QGraphicsScene>
#include <QGraphicsView>
#include <QGraphicsRectItem>
#include <QFileDialog>
#include "math.h"#define M_PI 3.141592654int main(int argc, char *argv[])
{QApplication a(argc, argv);QGraphicsScene scene; // 定义一个场景,设置背景色为红色//QGraphicsScene scene(-1000, -1000, 2000, 2000); // 定义一个场景,设置背景色为红色//QGraphicsScene scene(-400, -400, 800, 800); // 定义一个场景,设置背景色为红色scene.setBackgroundBrush(Qt::red);QPen pen; // 定义一个画笔,设置画笔颜色和宽度pen.setColor(QColor(0, 160, 230));pen.setWidth(10);QGraphicsRectItem *m_rectItem = new QGraphicsRectItem(); // 定义一个矩形图元m_rectItem->setRect(0, 0, 80, 80);m_rectItem->setPen(pen);m_rectItem->setBrush(QBrush(QColor(255, 0, 255)));m_rectItem->setFlag(QGraphicsItem::ItemIsMovable);QGraphicsLineItem *m_lineItem = new QGraphicsLineItem(); // 定义一个直线图元m_lineItem->setLine(QLineF(0, 0, 100, 100));m_lineItem->setPen(pen);m_lineItem->setFlag(QGraphicsItem::ItemIsMovable);QGraphicsPathItem *m_pathItem = new QGraphicsPathItem(); // 定义一个路径图元QPainterPath path;path.moveTo(90, 50);for (int i = 1; i < 5; ++i){path.lineTo(50 + 40 * cos(0.8 * i * M_PI), 50 + 40 * sin(0.8 * i * M_PI));}path.closeSubpath();m_pathItem->setPath(path);m_pathItem->setPen(pen);m_pathItem->setFlag(QGraphicsItem::ItemIsMovable);QGraphicsPolygonItem *m_polygonItem = new QGraphicsPolygonItem(); // 定义一个多边形图元QPolygonF polygon;polygon << QPointF(-100.0, -150.0) << QPointF(-120.0, 150.0)<< QPointF(320.0, 160.0) << QPointF(220.0, -140.0);m_polygonItem->setPolygon(polygon);m_polygonItem->setPen(pen);m_polygonItem->setFlag(QGraphicsItem::ItemIsMovable);// 使用无参构造函数创建一个 QGraphicsPixmapItem 对象QGraphicsPixmapItem *m_pixmapItem = new QGraphicsPixmapItem(nullptr);m_pixmapItem->setFlag(QGraphicsItem::ItemIsMovable);QPixmap pixmap;QString fileName = QFileDialog::getOpenFileName(NULL, "open image file",".","Image files (*.bmp *.jpg *.pbm *.pgm *.png *.ppm *.xbm *.xpm);;All files (*.*)");if(fileName != ""){// 加载一个 QPixmap 图像pixmap.load(fileName);// 按比例缩放//pixmap = pixmap.scaledToWidth(500);// 为已创建的 QGraphicsPixmapItem 设置图像m_pixmapItem->setPixmap(pixmap);}m_rectItem->setPos(-200, -200);QPointF p1 = m_rectItem->scenePos();m_lineItem->setPos(200, 200);QPointF p2 = m_lineItem->scenePos();m_pathItem->setPos(200, -200);QPointF p3 = m_pathItem->scenePos();m_polygonItem->setPos(-200, 200);QPointF p4 = m_polygonItem->scenePos();m_pixmapItem->setPos(0, 0);QPointF p5 = m_pixmapItem->scenePos();//scene.addItem(m_rectItem); // 把矩形图元添加到场景//scene.addItem(m_lineItem); // 把直线图元添加到场景//scene.addItem(m_pathItem); // 把路径图元添加到场景//scene.addItem(m_polygonItem); // 把多边形图元添加到场景scene.addItem(m_pixmapItem); // 把图形图元添加到场景QGraphicsView view;m_pixmapItem->setScale(0.1);QPointF pointScene = m_pixmapItem->mapToScene(m_pixmapItem->pos());QPointF pointView = view.mapFromScene(pointScene);view.setScene(&scene);Qt::Alignment al = view.alignment();//默认的Qt::AlignCenterview.setAlignment(Qt::AlignLeft | Qt::AlignTop);//QGraphicsView view(&scene); // 定义一个视图,并把场景添加到视图view.resize(1200, 800);view.show();QRectF r1 = scene.sceneRect();QRectF r2 = view.sceneRect();QSize s1 = view.size();return a.exec();
}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

(免费送源码)计算机毕业设计原创定制:Java+B/S+SSM+Web前端开发技术+IDEA+MySQL+Navicat 有风小院

摘 要 信息化社会内需要与之针对性的信息获取途径&#xff0c;但是途径的扩展基本上为人们所努力的方向&#xff0c;由于站在的角度存在偏差&#xff0c;人们经常能够获得不同类型信息&#xff0c;这也是技术最为难以攻克的课题。针对有风小院等问题&#xff0c;对有风小院信息…

Soul App创始人张璐团队亮相GITEX GLOBAL 2024,展示多模态AI的交互创新

随着全球AI领域的竞争加剧,越来越多的科技巨头和创新企业纷纷致力于多模态AI的开发。2024年10月14日至18日,GITEX GLOBAL海湾信息技术博览会在迪拜举行,吸引了超过6700家全球科技巨头和创新公司参与,展示了智能互联、人工智能等领域的新成果。 此次展会中,Soul App创始人张璐团…

新版布谷直播软件源码开发搭建功能更新明细

即将步入2025年也就是山东布谷科技专注直播系统开发,直播软件源码出售开发搭建等业务第9年,山东布谷科技不断更新直播软件功能&#xff0c;以适应当前新市场环境下的新要求。山东布谷科技始终秉承初心&#xff0c;做一款符合广大客户需求的直播系统软件。支持广大客户提交更多个…

Dockerfile打包部署

Dockerfile打包 先找到打包完的目录下创建一个Dockerfile文件 touch Dockerfile 进去文件内编写 vim Dockerfile # 基础镜像 FROM openjdk:8 # author MAINTAINER yxh # 挂载目录 VOLUME /home/project # 创建目录 RUN mkdir -p /home/project # 指定路径 WORKDIR /home/pr…

c++趣味编程玩转物联网:基于树莓派Pico控制有源蜂鸣器

有源蜂鸣器是一种简单高效的声音输出设备&#xff0c;广泛应用于电子报警器、玩具、计时器等领域。在本项目中&#xff0c;我们结合树莓派Pico开发板&#xff0c;通过C代码控制有源蜂鸣器发出“滴滴”声&#xff0c;并解析其中涉及的关键技术点和硬件知识。 一、项目概述 1. 项…

【NLP高频面题 - 分布式训练】ZeRO1、ZeRO2、ZeRO3分别做了哪些优化?

【NLP高频面题 - 分布式训练】ZeRO1、ZeRO2、ZeRO3分别做了哪些优化&#xff1f; 重要性&#xff1a;★★ NLP Github 项目&#xff1a; NLP 项目实践&#xff1a;fasterai/nlp-project-practice 介绍&#xff1a;该仓库围绕着 NLP 任务模型的设计、训练、优化、部署和应用&am…

路由引入中次优路由和路由环路问题

A公司用的是IS-IS&#xff0c;B公司用的是OSPF&#xff0c;现在这两个公司要合并&#xff0c;网络要相通 项目目标 前期准备 配置IP地址&#xff1a;完成IP地址规划&#xff0c;A公司和B公司内部网络通过路由器R2和R4环回接口模拟。配置路由器接口的IP地址并测试所有直连链路的…

shell脚本基础学习_总结篇(完结)

细致观看可以&#xff0c;访问shell脚本学习专栏&#xff0c;对应章节会有配图https://blog.csdn.net/2201_75446043/category_12833287.html?spm1001.2014.3001.5482 导语 一、shell脚本简介 1. 定义&#xff1a; 2. 主要特点&#xff1a; 3. shell脚本的基本结构 4. S…

光伏功率预测!Transformer-LSTM、Transformer、CNN-LSTM、LSTM、CNN五模型时序预测

目录 预测效果基本介绍程序设计参考资料 预测效果 基本介绍 Transformer-LSTM、Transformer、CNN-LSTM、LSTM、CNN五模型多变量时序光伏功率预测 (Matlab2023b 多输入单输出) 1.程序已经调试好&#xff0c;替换数据集后&#xff0c;仅运行一个main即可运行&#xff0c;数据格式…

Postman定义公共函数

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 Postman定义公共函数 在postman中&#xff0c;如下面的代码&#xff1a; 1、返回元素是否与预期值一致 var assertEqual(name,actual,expected)>{tests[…

SpringAI:Java 开发的智能新利器

一、SpringAI 简介 随着人工智能技术的飞速发展&#xff0c;越来越多的开发者开始探索如何将 AI 能力集成到现有的应用中来提升产品的智能化水平。Spring AI 正是为 Java 开发者提供的一款强大的 AI 框架&#xff0c;使得这一集成过程变得前所未有的简单和高效。 本文将深入探…

javaweb-day02-JS(javascript)

1.JavaScript引入 &#xff08;1&#xff09;引入方式 2.JS语法 2.1 书写语法 2.2 变量 &#xff08;1&#xff09;var关键字定义的是全局变量&#xff1b; &#xff08;2&#xff09;可以重复声明&#xff1b; 2.3 数据类型&运算符 &#xff08;1&#xff09;数据类型…

极狐GitLab 17.6 正式发布几十项与 DevSecOps 相关的功能【三】

GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署极狐GitLab。 学习极狐GitLab 的相关资料&#xff1a; 极狐GitLab 官网极狐…

七牛云AIGC内容安全方案助力企业合规创新

随着人工智能生成内容(AIGC)技术的飞速发展,内容审核的难度也随之急剧上升。在传统审核场景中,涉及色情、政治、恐怖主义等内容的标准相对清晰明确,但在AIGC的应用场景中,这些界限变得模糊且难以界定。用户可能通过交互性引导AI生成违规内容,为审核工作带来了前所未有的不可预测…

Python语法基础(三)

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 我们这篇文章来说一下函数的返回值和匿名函数 函数的返回值 我们先来看下面的这一段函数的定义代码 # 1、返回值的意义 def func1():print(111111111------start)num166print…

导入100道注会cpa题的方法,导入试题,自己刷题

一、问题描述 复习备考的小伙伴们&#xff0c;往往希望能够利用零碎的时间和手上的试题&#xff0c;来复习和备考 用一个能够导入自己试题的刷题工具&#xff0c;既能加强练习又能利用好零碎时间&#xff0c;是一个不错的解决方案 目前市面上刷题工具存下这些问题 1、要收费…

使用flink编写WordCount

1. env-准备环境 2. source-加载数据 3. transformation-数据处理转换 4. sink-数据输出 5. execute-执行 流程图&#xff1a; DataStream API开发 //nightlies.apache.org/flink/flink-docs-release-1.13/docs/dev/datastream/overview/ 添加依赖 <properties>&l…

【SpringBoot】28 API接口防刷(Redis + 拦截器)

Gitee仓库 https://gitee.com/Lin_DH/system 介绍 常用的 API 安全措施包括&#xff1a;防火墙、验证码、鉴权、IP限制、数据加密、限流、监控、网关等&#xff0c;以确保接口的安全性。 常见措施 1&#xff09;防火墙 防火墙是网络安全中最基本的安全设备之一&#xff0c…

java全栈day10--后端Web基础(基础知识)

引言&#xff1a;只要能通过浏览器访问的网站全是B/S架构&#xff0c;其中最常用的服务器就是Tomcat 在浏览器与服务器交互的时候采用的协议是HTTP协议 一、Tomcat服务器 1.1介绍 官网地址&#xff1a;Apache Tomcat - Welcome! 1.2基本使用(网上有安装教程&#xff0c;建议…

elasticsearch的索引模版使用方法

5 索引模版⭐️⭐️⭐️⭐️⭐️ 索引模板就是创建索引时要遵循的模板规则索引模板仅对新创建的索引有效&#xff0c;已经创建的索引并不受索引模板的影响 5.1 索引模版的基本使用 1.查看所有的索引模板 GET 10.0.0.91:9200/_index_template2.创建自定义索引模板 xixi &…