Qt绘图QGraphicsView、QGraphicsScene、QGraphicsItem简述

2023-11-06

Qt绘图中,QGraphicsView、QGraphicsScene、QGraphicsItem三者之间密不可分,以下简单介绍三者之间关系。


三者之间关系:

如同绘画的过程,Qt绘图中,QGraphicsView的作用相当于画板,QGraphicsScene等效于画布,QGraphicsItem为画布上的

  1. 拿出画板,订上一张画布:UI中添加了一个QGraphicsView后,需要往其中添加QGraphicsScene,可以添加好几张画布。
  2. 拿起笔,在画布上作画:往QGraphicsScene上添加各式各样的QGraphicsItem,QGraphicsItem有很多种,最常用的是QGraphicsPixmapItem,也就是贴图到画布上;使用QPainter,可以自己亲自画线。

大致过程就如上所述,因此完成一幅图片的显示需要三个步骤:

  1. 将Pixmap添加至QGraphicsPixmapItem;
  2. 将QGraphicsPixmapItem添加至QGraphicsScene;
  3. 将QGraphicsScene添加至QGraphicsView;

三者间坐标关系:

若想让图片动起来或者在自定义位置显示,则不得不考虑坐标问题,三者均有自己的坐标系,坐标系原点在左上角,如图所示:

 我们可以对item的元素进行旋转、缩放等操作,此时坐标系之间的关系会发生变化,话不多说,直接上程序:

//新建一个Qt Widgets Application
//在mainwindow.ui里添加一个QGraphicsView
//添加需要的头文件,在MainWindow构造函数里添加以下函数
//写在ui->setupUi(this);后
//
QGraphicsScene *scene;
QGraphicsPixmapItem *item;
QPixmap *painterPix;

scene = new QGraphicsScene;//新建一个场景
ui->graphicsView->setScene(scene);//将场景添加进视图
scene->addRect(0,0,500,500);//设置场景位置(0,0),大小500x500

//设置三个不同的方块,打印出每个方块的坐标,方块中心场景坐标,方块中心坐标
//第一个方块,黑色
item = new QGraphicsPixmapItem;//新建一个item
painterPix = new QPixmap(50,50);//新建一幅图
painterPix = fill(Qt::black);//将图设置为黑色
item->setPixmap(*painterPix);//将图添加进item
scene->addItem(item);//将item添加进场景
item->setPos(0,0);//设置item坐标为(0,0)
qDebug()<<"black pos:"<<item->pos()<<"black pixPos:"<<item->mapToParent(item->pixmap().rect().center())<<"pix cenPos:"<<item->pixmap().rect().center();

//第二个方块,蓝色,旋转90度
item = new QGraphicsPixmapItem;
painterPix = new QPixmap(50,50);
painterPix = fill(Qt::blue);
item->setPixmap(*painterPix);
scene->addItem(item);
item->setPos(50,50);
item->setRotation(90);//旋转90度
qDebug()<<"black pos:"<<item->pos()<<"black pixPos:"<<item->mapToParent(item->pixmap().rect().center())<<"pix cenPos:"<<item->pixmap().rect().center();

//第三个方块,红色,放大为原来的2倍
item = new QGraphicsPixmapItem;
painterPix = new QPixmap(50,50);
painterPix = fill(Qt::red);
item->setPixmap(*painterPix);
scene->addItem(item);
item->setPos(100,100);
item->setRotation(2);//放大两倍
qDebug()<<"black pos:"<<item->pos()<<"black pixPos:"<<item->mapToParent(item->pixmap().rect().center())<<"pix cenPos:"<<item->pixmap().rect().center();

 得到结果为下图所示:

 打印出来的坐标值为:

黑:(0,0),(24,24),(24,24)

蓝:(50,50),(26,74),(24,24)

红:(100,100),(148,148),(24,24)

因此得出结论:

  • item的坐标即为item左上角点在scene的坐标
  • item中图像中心坐标,为中心点在item坐标系下的坐标
  • item中图像的坐标,不随着item自身的放大旋转的影响
  • item的旋转放大等操作,均以左上角坐标为原点

 

最终,可以看出,要时刻记得左上角为原点,外部的坐标变化不影响内部的坐标,可以通过mapToParent等方法完成各坐标系间的坐标转换。

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt绘图QGraphicsView、QGraphicsScene、QGraphicsItem简述 的相关文章

  • Qt Creator:如何区分 win32 和 win64

    我必须在 pro 文件中执行类似的操作 win32 LIBS L 3rdparty libusb win32 lib msvc llibusb else win64 LIBS L 3rdparty libusb win32 lib msvc
  • 如何创建QWidget的屏幕截图?

    我在 Qt Creator 中做作业 在其中绘制 QWidget 并且需要保存此 QWdiget 的某些部分 我试图解决这个问题 QPixmap pixmap pixmap copy rectangle rectangle is part
  • Qt WinRT 应用程序无法访问文件权限被拒绝

    我需要使用 Qt 和 FFMPEG 开发 WinRT 应用程序 我根据指令构建了 WinRT 的 ffmpeghere https github com Microsoft FFmpegInterop我可以将库与我的项目链接起来 现在我需要
  • QTcpSocket 有时不发送数据

    我有两个 QT 应用程序 一个应用程序可以被认为保存了大数据 它每秒向第二个应用程序发送大约 10 KB 的数据块 之前我尝试使用QUdpSocket来传输数据 但由于MTU限制在2 5K左右 并且需要自己分割和重新组合数据 所以我改用QT
  • QTextEdit.find() 在 Python 中不起作用

    演示问题的简单代码 usr bin env python import sys from PyQt4 QtCore import QObject SIGNAL from PyQt4 QtGui import QApplication QTe
  • PyQt:如何设置组合框项目可检查?

    为了将 GUI 小部件数量保持在最低限度 我需要找到一种方法来为用户提供下拉菜单项的选择 这些菜单项可用于过滤掉 listWidget 项中显示的内容 假设 listWidget 列出了 5 个不同类别的项目 Cat A Cat B Cat
  • 禁用 QML Slider 的鼠标滚轮

    我希望能够滚动Flickable使用鼠标滚轮 或触摸板上的两根手指 不改变Sliders它可能包含 示例代码及结果应用 import QtQuick 2 7 import QtQuick Window 2 2 import QtQuick
  • 如何创建用于 QML 的通用对象模型?

    我想知道是否有任何宏或方法如何将 Qt 模型注册为 QObject 的属性 例如 我有AnimalModel http doc qt io qt 5 qtquick modelviewsdata cppmodels html qabstra
  • 为 Windows 98 编译 Qt

    我需要支持 Windows 98 Qt 文档声称这是可能的 但没有说明 Qt 4 6 的分布式二进制文件不能在 Win98 上运行 而且我采样的大多数 Qt 应用程序也不能在 Win98 上运行 对于几个确实在 98 上运行的应用程序 我询
  • 如何在 QTabWidget Qt 中展开选项卡

    我有一个QTabWidget像这个 但我想展开选项卡以 填充 整个小部件宽度 如下所示 我怎样才能做到这一点 我在用Qt 5 3 2 and Qt 创建者 3 2 1 Update 我尝试使用setExpanding功能 ui gt myT
  • 即使在可访问性中勾选应用程序,AXIsProcessTrustedWithOptions 也不会返回 true

    As this question https stackoverflow com questions 17693408 enable access for assistive devices programmatically on 10 9
  • Qt:如何连接到 SQLite?

    我安装了 SQLite3 解压到 c sqlite 创建了一个数据库 c sqlite mzsales 现在我试图在 QTableView 中显示其内容 QSqlDatabase db QSqlDatabase addDatabase QS
  • 将 gnuplot 嵌入现有 QtWidget 中

    我正在用 C 创建一个 伪 实时绘图应用程序 使用 gnuplot 作为绘图后端 我的要求之一是绘图必须位于现有窗口内 而不是有一个单独的绘图窗口 gnuplot 默认为 Gnuplot 有一个选项可以指定 Qt 小部件 ID 这似乎适合我
  • Qt - 设置不可编辑的QComboBox的显示文本

    我想将 QComboBox 的文本设置为某些自定义文本 不在 QComboBox 的列表中 而不将此文本添加为 QComboBox 的项目 此行为可以在可编辑的 QComboBox 上实现QComboBox setEditText cons
  • 同时从多个流中捕获、最佳方法以及如何减少 CPU 使用率

    我目前正在编写一个应用程序 该应用程序将捕获大量 RTSP 流 在我的例子中为 12 个 并将其显示在 QT 小部件上 当我超过大约 6 7 个流时 问题就会出现 CPU 使用率激增并且出现明显的卡顿 我认为它不是 QT 绘制函数的原因是因
  • 在高 dpi Windows 平台上自动重新缩放应用程序?

    我正在编写一个需要在高 dpi Windows 192dpi 而不是 96dpi 上运行的 Qt 应用程序 不幸的是 Qt 框架尚不支持高 dpi 至少在 Windows 上 因此我的应用程序及其所有元素看起来只有应有尺寸的一半 有没有办法
  • Qt 5.3 无法使 QCompass (QSensor) 在 Windows 8.1 上工作

    我无法让传感器在我的 Asus Transformer T100 上工作 磁力计和指南针无法启动 并且我从加速度计获得假值 始终 x 0 y 9 8 z 0 即使使用我的笔记本电脑 我总是得到相同的结果 第一段文字编辑 Initialisa
  • 如何将 zlib 添加到现有的 qt 安装中

    如何将 zlib 添加到 Qt 的现有安装中 我对此很陌生 所以请给我详细的描述 提前感谢您的帮助 zlib 包含在 Qt 核心库中 如果你想在 Qt 程序中使用 zlib 函数 你只需要包含 src 3rdparty zlib 中的 zl
  • 在 Qthread 中运行函数 - 应用程序将挂起

    我在 QT 内部线程方面遇到一些问题 include
  • 如何在qt中创建正确的退出按钮

    我正在尝试创建一个退出按钮来正确关闭我在 QT 中制作的 GUI 我尝试通过以下方式执行此操作 include

随机推荐

  • 关于qmake报错

    qmake could not find a Qt installation of 或 qmake could not exec usr lib x86 64 linux gnu qt4 bin qmake 或 qmake could no
  • UE5 MediaPlayer无法正确播放视频

    StreamMediaSource 播放流媒体源 流媒体源 Stream Media Source 是一种资源 允许你在虚幻引擎5 UE5 中流送支持的 URL格式视频 定义流后 你可以将其加载并使用 媒体播放器 资源在UE4中播放 并可
  • QT笔记- QTreeView设置三态setAutoTristate() 树形视图自动复选框——源码分享

    说明 Qt中函数QStandardItem setAutoTristate 无实际功能 仅作为一个布尔标记 若要实现自动三态复选框功能 需要自行代码构建 本文通过编写两个派生类 完成了这个功能 类源码和一个示例如下 源码 自动三态item
  • 《人工智能狂潮》读后感——什么是人工智能?(一)

    从本专栏开始 作者正式研究Python深度学习 神经网络及人工智能相关知识 前一篇文章详细讲解了无监督学习Autoencoder的原理知识 然后用MNIST手写数字案例进行对比实验及聚类分析 本篇文章将分享 人工智能狂潮 书籍内容 包括人工
  • 【一题多解】插入回文串——典型的动态规划区间模型

    插入回文串 典型的动态规划区间模型 题目 给定一个长度为n n lt 1000 的字符串A 求插入最少多少个字符使得它变成一个回文串 之前我做的DP的问题 大多都是二维的或者一维的 今天就讲下这道典型的一维区间模型 附上之前写过的二维一维D
  • 二叉树叶子节点数和度为2的节点数

    我们设度为0 1 2的节点分别为n0 n1 n2个 那么节点总数n n0 n1 n2 然而边数b n 1 并且b n1 2 n2 n 1 n0 n1 n2 1 由此式我们可以推出n0 n2 1 也就是说叶子节点要比度为二的节点多一个 转载于
  • 总结 运行Scrapy项目结果出错:KeyError: ‘Spider not found:

    1 命令行窗口的当前路径不在scrapy工程目录中 需要先进入scrapy工程目录 不一定要工程根目录 下一级子目录也可以 2 执行命令 scrapy crawl fileName 时 不要加 py后缀 本人就是加了后缀 一直错误 正确 s
  • ChromeOS 体验

    概述 作为一名开发人员 一直关注各种桌面级 移动级操作系统的进展 其中就包含 ChromeOS 对于一个开发者 客户端 嵌入式 硬件开发者除外 而言 对于操作系统的要求如下 流畅 稳定而现代化的系统 UI 完整的 Linux 环境 好用的浏
  • C#get和set

    这里写目录标题 为什么要使用get和set 使用get访问私有变量 使用set和get定义一个索引器 为什么要使用get和set 因为在代码中存在着私有的值 我们不能在它的私有域外调用这些私有值 若要访问这些私有值 则需要使用get和set
  • Python,OpenCV图像金字塔cv2.pyrUp(), cv2.pyrDown()

    Python OpenCV图像金字塔cv2 pyrUp cv2 pyrDown 1 效果图 2 原理 2 1 什么是图像金字塔 2 2 金字塔分类 2 3 应用 3 源码 参考 这篇博客将介绍图像金字塔的理论 及用图像金字塔cv2 pyrU
  • vscode快捷键创建多个html标签

    vscode快捷键创建多个html标签 vscode中输入命令 按下Tab键 Tab键 没反应解决办法 参考地址 https blog csdn net xingyun piaofu article details 131879072 sp
  • 前端福利:使用Wallpaper Engine让自己的桌面炫酷起来

    Wallpaper Engine 是一款Steam上的特别特别炫酷的壁纸定制软件 它可以对你的桌面进行定制 可以使用视频 动画 网页等形式来替换壁纸 注意到没 关键是可以使用Html格式的文件作为桌面 前端福利啊有木有 首先 先先下载软件下
  • QT结合Mupdf实现预览pdf

    要在Qt中结合MuPDF库预览PDF文件 你可以按照以下步骤进行操作 1 下载并安装MuPDF库 首先 你需要从MuPDF的官方网站或代码托管网站上下载MuPDF库的源代码 并按照文档中的说明进行安装 确保你已经安装了所有必需的依赖项 2
  • 因果推断综述-A Survey on Causal Inference

    最近读到一篇讲述很全面的综述文献 A Survey on Causal Inference 对于接触因果推断不久的同学而言是特别详细的介绍和科普 文献很长 我会分成几部分介绍 目录 摘要 第一部分 简介 第二部分 因果推断基础知识 第三部分
  • java(有关类成员变量的访问权限)

    private public protected 默认不写 firendly 1 Class类的访问权限 public 可以供所有的类访问 默认 默认可以称为friendly但是 java语言中是没有friendly这个修饰符的 这样称呼应
  • Linux 编写定时任务

    1 先进入根目录 mkdir p home wangwenjun scripts cd home wangwenjun scripts 2 编写第一个shell文件 test sh vim test sh bin sh now date Y
  • Windows下Git-preview中文乱码的解决方法

    在Windows下安装Git preview 1 7 4后 使用中发现许多的乱码问题 感觉甚是不便 这是因为Git是在linux下开发的管理软件 而linux的编码方式是基于UTF 8的 所以移植到Windows之后难免会存在编码方式不同的
  • android wear 微信语音,moto 360手表语音回复微信教程

    moto360智能手表是一款搭载android系统的智能手表 目前微信已经添加了对智能手表的支持 不过很多玩家对于怎么使用moto 360语音回复微信还不是很清楚 下面小编就为大家分享一下moto 360语音回复微信教程 moto 360语
  • 最大权闭合子图(最小割)

    最大权闭合子图 最大流最小割 参考资料 1 最大权闭合子图 权闭合子图 存在一个图的子图 使得子图中的所有点出度指向的点依旧在这个子图内 则此子图是闭合子图 在这个图中有8个闭合子图 3 4 2 4 3 4 1 3 4 2 3 4 1 2
  • Qt绘图QGraphicsView、QGraphicsScene、QGraphicsItem简述

    Qt绘图中 QGraphicsView QGraphicsScene QGraphicsItem三者之间密不可分 以下简单介绍三者之间关系 三者之间关系 如同绘画的过程 Qt绘图中 QGraphicsView的作用相当于画板 QGraphi