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。

6、建议的步骤

        按照View的大小设置Scene:scene.setSceneRect(0, 0, view.size().width()-2, view.size().height()-2);,再通过Item或ItemGroup的SetPos设置图元在Scene的位置。

        附一些测试代码:

//#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 <QStandardPaths>
#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.setSceneRect(0, 0, 1198, 798);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 desktopLocation = QStandardPaths::writableLocation(QStandardPaths::DesktopLocation);QString fileName = QFileDialog::getOpenFileName(NULL, "open image file",//".",desktopLocation,"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_pixmapItem->setScale(0.1);}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); // 把图形图元添加到场景QGraphicsItemGroup *m_pItemGroup = new QGraphicsItemGroup;//m_pItemGroup->addToGroup(m_rectItem);//m_pItemGroup->addToGroup(m_lineItem);//m_pItemGroup->addToGroup(m_pathItem);//m_pItemGroup->addToGroup(m_polygonItem);m_pItemGroup->addToGroup(m_pixmapItem);m_pItemGroup->setFlag(QGraphicsItem::ItemIsMovable);m_pItemGroup->setFlag(QGraphicsItem::ItemIsSelectable);m_pItemGroup->setPos(100, 100);scene.addItem(m_pItemGroup); // 把图元组添加到场景QGraphicsView view;QPointF pointScene = m_pixmapItem->mapToScene(m_pixmapItem->pos());QPointF pointView = view.mapFromScene(pointScene);view.setScene(&scene);view.resize(1200, 800);scene.setSceneRect(0, 0, view.size().width()-2, view.size().height()-2);Qt::Alignment al = view.alignment();//默认的Qt::AlignCenter//view.setAlignment(Qt::AlignLeft | Qt::AlignTop);//QGraphicsView view(&scene); // 定义一个视图,并把场景添加到视图view.show();QRect re = view.frameRect();QSize si = view.size();QSize si2 = view.viewport()->size();QRectF r1 = scene.sceneRect();QRectF r2 = view.sceneRect();return a.exec();
}

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

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

相关文章

【配置】pycharm运行的项目如何修改名称(项目名称、模块名称)

当我们需要修改项目名称、模块名称的时候&#xff0c;能够在网上找一些修改的方法&#xff0c;但是有没有很保守但很使用的方法可以解决这个问题呢&#xff1f; 创建项目 通过pycharm创建一个django的项目 创建之后的项目目录&#xff1a; 更改项目名称&#xff1a; 往往以…

【新人系列】Python 入门(十四):文件操作

✍ 个人博客&#xff1a;https://blog.csdn.net/Newin2020?typeblog &#x1f4dd; 专栏地址&#xff1a;https://blog.csdn.net/newin2020/category_12801353.html &#x1f4e3; 专栏定位&#xff1a;为 0 基础刚入门 Python 的小伙伴提供详细的讲解&#xff0c;也欢迎大佬们…

MySQL 启动失败问题分析与解决方案:`mysqld.service failed to run ‘start-pre‘ task`

目录 前言1. 问题背景2. 错误分析2.1 错误信息详解2.2 可能原因 3. 问题排查与解决方案3.1 检查 MySQL 错误日志3.2 验证 MySQL 配置文件3.3 检查文件和目录权限3.4 手动启动 MySQL 服务3.5 修复 systemd 配置文件3.6 验证依赖环境 4. 进一步优化与自动化处理结语 前言 在日常…

IDEA Maven 打包找不到程序包错误或找不到符号,报错“程序包不存在“

参考文章&#xff1a;https://blog.csdn.net/yueeryuanyi/article/details/14211090 问题&#xff1a;IDEA Maven 打包找不到程序包错误或找不到符号,报错“程序包不存在“编译都没问题 解决思路 – >【清除缓存】 1. 强制刷新Maven缓存 选择 Maven 标签&#xff0c;Exe…

通过 SSH 进行WordPress网站的高级服务器管理

我在管理hostease的服务器时&#xff0c;时常需要通过SSH登录服务器进行修改。而在网站管理中&#xff0c;SSH不仅是一个基础工具&#xff0c;更是高级用户用来精细化管理和优化服务器的重要工具。通过SSH&#xff0c;你可以深入监控服务器的性能、精细管理系统资源&#xff0c…

分布式搜索引擎之elasticsearch单机部署与测试

分布式搜索引擎之elasticsearch单机部署与测试 1.部署单点es 1.1.创建网络 因为我们还需要部署kibana容器&#xff0c;因此需要让es和kibana容器互联。这里先创建一个网络&#xff1a; docker network create es-net1.2.加载镜像 这里我们采用elasticsearch的7.12.1版本的…

WPF+MVVM案例实战与特效(三十)- 封装一个系统日志显示控件

文章目录 1、运行效果2、日志控件封装1、文件创建2、DisplayLogPanel.xaml 代码3、using System;3、using System;3、数据模型4、枚举类型3、案例实现1、LogPanelWindow.xaml2、LogPanelViewModel.cs4、总结1、运行效果 2、日志控件封装 1、文件创建 打开 Wpf_Examples ,在 …

第二节——计算机网络(四)物理层

车载以太网采用差分双绞线车载以太网并未指定特定的连接器&#xff0c;连接方式更为灵活小巧&#xff0c;能够大大减轻线束重量。传统以太网一般使用RJ45连接器连接。车载以太网物理层需满足车载环境下更为严格的EMC要求&#xff0c;100BASE-T1\1000BASE-T1对于非屏蔽双绞线的传…

使用vcpkg自动链接tinyxml2时莫名链接其他库(例如boost)

使用vcpkg自动链接tinyxml2时莫名链接其他库&#xff08;例如boost&#xff09; vcpkg的自动链接功能非常方便&#xff0c;但在某些情况下会出现过度链接的问题。 链接错误症状 以tinyxml2为例&#xff0c;程序中调用tinyxml2的函数后&#xff0c;若vcpkg中同时存在opencv和…

PyTorch 模型转换为 ONNX 格式

PyTorch 模型转换为 ONNX 格式 在深度学习领域&#xff0c;模型的可移植性和可解释性是非常重要的。本文将介绍如何使用 PyTorch 训练一个简单的卷积神经网络&#xff08;CNN&#xff09;来分类 MNIST 数据集&#xff0c;并将训练好的模型转换为 ONNX 格式。我们还将讨论 PTH …

Vue+Elementui el-tree树只能选择子节点并且支持检索

效果&#xff1a; 只能选择子节点 添加配置添加检索代码 源码&#xff1a; <template><div><el-button size"small" type"primary" clearable :disabled"disabled" click"showSign">危险点评估</el-button>…

分析JHTDB数据库的Channel5200数据集的数据(SciServer服务器)

代码来自https://github.com/idies/pyJHTDB/blob/master/examples/channel.ipynb %matplotlib inline import numpy as np import math import random import pyJHTDB import matplotlib.pyplot as plt import time as ttN 3 T pyJHTDB.dbinfo.channel5200[time][-1] time …

《Vue零基础入门教程》第十二课:双向绑定指令

往期内容 《Vue零基础入门教程》第六课&#xff1a;基本选项 《Vue零基础入门教程》第八课&#xff1a;模板语法 《Vue零基础入门教程》第九课&#xff1a;插值语法细节 《Vue零基础入门教程》第十课&#xff1a;属性绑定指令 《Vue零基础入门教程》第十一课&#xff1a;事…

windows 应用 UI 自动化实战

UI 自动化技术架构选型 UI 自动化是软件测试过程中的重要一环&#xff0c;网络上也有很多 UI 自动化相关的知识或资料&#xff0c;具体到 windows 端的 UI 自动化&#xff0c;我们需要从以下几个方面考虑&#xff1a; 开发语言 毋庸置疑&#xff0c;在 UI 自动化测试领域&am…

linux部署Whisper 视频音频转文字

github链接&#xff1a;链接 我这里使用anaconda来部署&#xff0c;debian12系统&#xff0c;其他linux也同样 可以使用gpu或者cpu版本&#xff0c;建议使用n卡&#xff0c;rtx3060以上 一、前期准备 1.linux系统 链接&#xff1a;debian安装 链接&#xff1a;ubuntu安装 …

MySQL聚合查询分组查询联合查询

#对应代码练习 -- 创建考试成绩表 DROP TABLE IF EXISTS exam; CREATE TABLE exam ( id bigint, name VARCHAR(20), chinese DECIMAL(3,1), math DECIMAL(3,1), english DECIMAL(3,1) ); -- 插入测试数据 INSERT INTO exam (id,name, chinese, math, engli…

mini-spring源码分析

IOC模块 关键解释 beanFactory&#xff1a;beanFactory是一个hashMap, key为beanName, Value为 beanDefination beanDefination: BeanDefinitionRegistry&#xff0c;BeanDefinition注册表接口&#xff0c;定义注册BeanDefinition的方法 beanReference&#xff1a;增加Bean…

redis学习面试

1、数据类型 string 增删改查 set key valueget keydel kstrlen k 加减 incr articleincrby article 3decr articledecyby article 取v中特定位置数据 getrange name 0 -1getrange name 0 1setrange name 0 x 设置过期时间 setex pro 10 华为 等价于 set pro 华为expire pro…

详解MVC架构与三层架构以及DO、VO、DTO、BO、PO | SpringBoot基础概念

&#x1f64b;大家好&#xff01;我是毛毛张! &#x1f308;个人首页&#xff1a; 神马都会亿点点的毛毛张 今天毛毛张分享的是SpeingBoot框架学习中的一些基础概念性的东西&#xff1a;MVC结构、三层架构、POJO、Entity、PO、VO、DO、BO、DTO、DAO 文章目录 1.架构1.1 基本…

KST-3D01型胎儿超声仿真体模、吸声材料以及超声骨密度仪用定量试件介绍

一、KST-3D01型胎儿超声仿真体模 KST—3D01型胎儿超声体模&#xff0c;采用仿羊水环境中内置胎龄为7个月大仿胎儿设计。用于超声影像系统3D扫描演示装置表面轮廓呈现和3D重建。仿羊水超声影像呈暗回声&#xff08;无回波&#xff09;特性&#xff0c;仿胎儿超声影像呈对比明显…