当前位置: 首页 > news >正文

Qt QGraphics简述及例程 - QGraphicsView、QGraphicsScene和QGraphicsItem

Qt QGraphics简述及例程

  • 引言
  • 一、简单例程
  • 二、关于坐标系问题

引言

QGraphics*是Qt框架中,主要用于处理2D图形项的显示、交互和管理的模块,包括QGraphicsView、QGraphicsScene和QGraphicsItem。提供了一套高效的场景-视图架构,适合开发复杂的图形应用程序,如绘图工具、数据可视化、游戏等。该模块通过分层设计平衡了灵活性与性能,是Qt中处理复杂图形交互的首选方案。

  1. QGraphicsView
    用于显示场景内容的视图组件,支持缩放、旋转、滚动等交互操作。多个视图可以关联同一个场景,实现不同视角的同步展示。
  2. QGraphicsScene
    作为容器管理所有图形项(QGraphicsItem),负责场景的坐标系统、碰撞检测、事件传递等。场景可以包含数百万个项,但仍能保持高性能。
  3. QGraphicsItem
    所有图形项的基类,提供位置、变换、碰撞、绘制等基本功能。常见的派生类包括QGraphicsEllipseItem(圆形)、QGraphicsRectItem(矩形)等。

一、简单例程

简单的比喻:QGraphicsScene是一个场景,QGraphicsItem是场景里物体 (可以是多个),QGraphicsView是看场景的视角。

  • 可拖动Item的效果展示:
    在这里插入图片描述

  • 源码:

#include <QApplication>
#include <QGraphicsView>
#include <QGraphicsScene>
#include <QGraphicsRectItem>
#include <QGraphicsEllipseItem>
#include <QBrush>
#include <QPen>int main(int argc, char *argv[])
{QApplication app(argc, argv);// 创建一个场景QGraphicsScene scene;scene.setSceneRect(0, 0, 400, 300);// 创建一个矩形项并添加到场景QGraphicsRectItem *rectItem = new QGraphicsRectItem(50, 50, 100, 100);rectItem->setBrush(QBrush(Qt::blue));rectItem->setPen(QPen(Qt::black));rectItem->setFlag(QGraphicsItem::ItemIsMovable); // 允许拖动scene.addItem(rectItem);// 创建一个椭圆项并添加到场景QGraphicsEllipseItem *ellipseItem = new QGraphicsEllipseItem(200, 100, 150, 100);ellipseItem->setBrush(QBrush(Qt::red));ellipseItem->setPen(QPen(Qt::black));ellipseItem->setFlag(QGraphicsItem::ItemIsMovable); // 允许拖动scene.addItem(ellipseItem);// 创建一个视图并设置场景QGraphicsView view(&scene);view.setWindowTitle("示例");view.resize(500, 400);view.show();return app.exec();
}

Qt QGraphics体系及刷新机制介绍:https://zhuanlan.zhihu.com/p/613637924

二、关于坐标系问题

Qt图形视图框架三–坐标系统简介:https://blog.csdn.net/zhaoxd200808501/article/details/76177497

    1. QgraphicsScene的setSceneRect函数可以设置场景的位置(或者说View查看的位置)和大小。默认scene的中心和View的中心是重合的(默认Qt::AlignmentCenter),或者说默认原点(0,0)在中心,如下图所示:
      在这里插入图片描述
    QGraphicsScene *scene = new QGraphicsScene();scene->setBackgroundBrush(Qt::yellow);QGraphicsRectItem *rectItem = new QGraphicsRectItem(0, 0, 100, 100);scene->addItem(rectItem);//scene->setSceneRect(-50, -50, 100, 100);QGraphicsView *view = new QGraphicsView(scene);//view->setAlignment(Qt::AlignLeft|Qt::AlignTop);this->setCentralWidget(view);this->setGeometry(300, 300, 200, 200);
    1. 使用scene->setSceneRect(-50, -50, 100, 100)进行偏移,就是将view的查看的位置向左上都移动50 (也可以看作scene向右下移动50),由于默认Qt::AlignmentCenter,所有偏移是距离中心原点的距离,如下图所示:
      在这里插入图片描述
    1. 再设置view->setAlignment(Qt::AlignLeft|Qt::AlignTop);setSceneRect所设置的-50偏移,就是距离左上顶点的偏移,如下图所示:
      在这里插入图片描述

坐标系统问题总结:

  1. View和Scene的对齐方式,决定坐标系原点(0,0) (默认Qt::AlignmentCenter,中心作为原点),不是左上角为原点。
  2. setSceneRect设置的位置,是距离原点的位置。
  3. 换句话说就是,默认设置Scene的中心为坐标系原点,setSceneRect设置的(-50,-50)就是:View的中心在Scene中心左上方50处。

Qt工作笔记-QGraphicsView框架容易忽视的坐标问题-“画布”QgraphicsScene到底放在了哪儿?:https://blog.csdn.net/qq78442761/article/details/80965627
一个例子,搞懂QGraphicsView,QGraphicsScene坐标系统以及sceneRect设置:https://blog.csdn.net/biewenwoaaaa/article/details/144597336

http://www.lryc.cn/news/576828.html

相关文章:

  • 深入剖析Nacos服务发现与注册,及如何基于LoadBalancer实现负载均衡
  • #华为昇腾#华为计算#昇腾开发者计划2025#
  • Redis分布式锁核心原理源码
  • #华为鲲鹏#华为计算#鲲鹏开发者计划2025#
  • Transformer结构与代码实现详解
  • 【电路笔记 TMS320F28335DSP】TI SCI (增强型的UART) 点对点异步串行通信接口
  • 【OpenGL学习】(八)图形变换
  • Oauth2 自定义设置token过期时间
  • 状态机编程实战 | 如何更优雅地处理字符串
  • 全新大模型开源,腾讯(int4能打DeepSeek) Vs 谷歌(2GB运行多模态)
  • Gemini-CLI:谷歌开源的命令行AI工具,重新定义开发者工作流
  • Ubuntu22 安装 RTX 5070 Ti Nvidia Driver 驱动
  • 自学嵌入式 day27 进程
  • mac系统快捷键及命令安装
  • 状态模式 - Flutter中的状态变身术,让对象随“状态“自由切换行为!
  • 边界的艺术:支持向量机与统计学习时代的王者
  • 设计模式-外观模式、适配器模式
  • 【数据挖掘】聚类算法学习—K-Means
  • YOLOv12_ultralytics-8.3.145_2025_5_27部分代码阅读笔记-conv.py
  • 设备预测性维护和异常检测系统设计方案
  • 【HuggingFace】模型下载至本地访问
  • Git安装全攻略:避坑指南与最佳实践
  • C++ 格式化输入输出
  • 人工智能时代的职业替代风险与应对策略分析
  • MySQL技巧
  • 性能分析专栏 -- top命令
  • 【修电脑的小记录】连不上网
  • 打造地基: App拉起基础小程序容器
  • 疏通经脉: Bridge 联通逻辑层和渲染层
  • 深入理解 Dubbo 负载均衡:原理、源码与实践