Qt Graphics View

       Graphics View框架是用来处理大量2D图形对象的,适合需要高效管理和交互的场景,比如绘图软件、地图编辑或者游戏。它和QPainter的区别在于,Graphics View提供了更高级别的对象管理,而QPainter更偏向于直接绘制。

一、核心组件

  1. QGraphicsScene(场景)

    • 作为图形项的容器,管理所有图元的存储、状态及事件传播‌。
    • 支持背景层、图形项层和前景层的分层绘制,可通过setBackgroundBrush()setForegroundBrush()设置背景/前景‌。
    • 提供碰撞检测、图元查询(如itemAt())及批量渲染(render())功能‌。
  2. QGraphicsView(视图)

    • 用于显示场景内容,支持多视图查看同一场景,提供缩放、旋转、平移等交互操作‌。
    • 可通过继承并重写mouseMoveEvent()mousePressEvent()等实现自定义交互逻辑(如坐标追踪、点击响应)‌。
  3. QGraphicsItem(图元)

    • 所有图形元素的基类,支持自定义形状、事件处理(如鼠标拖拽、键盘事件)及坐标变换‌14。
    • 典型应用包括可拖动的十字标记(CrossMarkItem)和可调整大小的兴趣区域(ROIRectItem)‌。

二、关键特性

  1. 事件处理

    • 图元可直接响应鼠标点击、悬停、拖拽及键盘事件,事件通过场景传播至目标图元‌。
      示例:
      通过重写hoverEnterEvent()hoverLeaveEvent()实现图元悬停缩放效果‌。
      重写 mousePressEvent()keyPressEvent() 等实现交互。
    • 使用 QGraphicsSceneContextMenuEvent 处理右键菜单。
  2. 性能优化

    • 通过设置QGraphicsItem::ItemIgnoresTransformations避免不必要的变换计算‌。
  3. 坐标转换‌:

    • 场景坐标 ↔ 视图坐标:QGraphicsView::mapToScene() 和 mapFromScene()
    • 项间坐标转换:QGraphicsItem::mapToItem() 和 mapFromItem()
  4. 动画与效果‌:

    • 动画‌: 使用 QPropertyAnimation 或 QGraphicsItemAnimation
    • 特效‌: 应用 QGraphicsEffect(如阴影、模糊)。
  5. 碰撞检测‌:

    • scene->collidingItems(item) 检测碰撞项。
    • QGraphicsItem::shape() 自定义碰撞形状。
  6. 性能优化‌:

    • 启用视图缓存:view.setCacheMode(QGraphicsView::CacheBackground)
    • 使用 QGraphicsItem::ItemIgnoresTransformations 避免项随视图缩放。

三、基本用法

// 创建场景和项
QGraphicsScene scene;
QGraphicsRectItem *rect = scene.addRect(0, 0, 100, 50);// 创建视图并关联场景
QGraphicsView view(&scene);
view.setRenderHint(QPainter::Antialiasing); // 抗锯齿
view.show();

 四、开发建议

  • 模块化设计‌:将图元、视图逻辑分离,便于维护扩展(如独立实现CrossMarkItemGraphView类)‌。
  • 交互优化‌:使用QGraphicsView::setDragMode()启用拖拽模式,提升用户体验‌。
  • 内存管理‌: 项通常由场景负责删除,手动删除需谨慎。
  • 渲染性能‌: 避免过多复杂项;考虑使用 OpenGL 加速(QGraphicsView::setViewport(new QOpenGLWidget))。
  • 调试工具‌:利用QGraphicsScene::selectedItems()和焦点管理功能辅助调试复杂交互逻辑‌。

五、实例代码

1、基础实例:场景与视图初始化

#include <QApplication>
#include <QGraphicsScene>
#include <QGraphicsView>
#include <QGraphicsRectItem>int main(int argc, char *argv[]) {QApplication app(argc, argv);// 创建场景并设置范围QGraphicsScene *scene = new QGraphicsScene();scene->setSceneRect(0, 0, 800, 600);  // ‌:ml-citation{ref="1" data="citationList"}// 添加矩形图元QGraphicsRectItem *rectItem = new QGraphicsRectItem(100, 100, 200, 150);rectItem->setBrush(Qt::blue);scene->addItem(rectItem);  // ‌:ml-citation{ref="1,7" data="citationList"}// 创建视图并绑定场景QGraphicsView *view = new QGraphicsView(scene);view->setWindowTitle("Basic Example");view->show();return app.exec();
}

2、图元选择与坐标跟踪

实现功能‌:

  • 鼠标移动时实时显示场景坐标
  • 图元选中后支持键盘操作(删除、旋转、缩放)

关键代码‌:

// 继承 QGraphicsView 实现自定义视图
class CustomView : public QGraphicsView {
protected:void mouseMoveEvent(QMouseEvent *event) override {QPoint viewPos = event->pos();QPointF scenePos = mapToScene(viewPos);emit positionChanged(scenePos);  // 发送坐标信号}
};// 图元选中后处理键盘事件
void MyItem::keyPressEvent(QKeyEvent *event) {switch (event->key()) {case Qt::Key_Delete:scene()->removeItem(this);  // 删除图元 ‌break;case Qt::Key_Space:setRotation(rotation() + 90);  // 旋转 90°break;}
}

3、自定义图元实例

实现功能‌:

  • 十字标记支持鼠标拖拽
  • 拖拽时实时更新位置信号

‌关键代码:

// CrossMarkItem.h
class CrossMarkItem : public QGraphicsItem {
public:QRectF boundingRect() const override {return QRectF(-size_/2, -size_/2, size_, size_);}void paint(QPainter *painter, const QStyleOptionGraphicsItem*, QWidget*) override {painter->drawLine(-size_/2, 0, size_/2, 0);  // 水平线painter->drawLine(0, -size_/2, 0, size_/2);   // 垂直线}protected:QVariant itemChange(GraphicsItemChange change, const QVariant &value) override {if (change == ItemPositionChange) emit positionChanged(value.toPointF());  // 发送位置变化信号return QGraphicsItem::itemChange(change, value);}
};

4、ROI 矩形与动态更新

实现功能‌:

  • 可调整大小的兴趣区域(ROI)
  • 实时显示 ROI 的坐标和尺寸

设计要点‌:

  • 继承 QGraphicsRectItem 并添加控制点
  • 在边缘点拖拽时更新 ROI 范围

‌关键代码: 

class ROIRectItem : public QGraphicsRectItem {
public:void mouseMoveEvent(QGraphicsSceneMouseEvent *event) override {QPointF delta = event->pos() - event->lastPos();setRect(rect().adjusted(delta.x(), delta.y(), delta.x(), delta.y()));  // 动态调整矩形}
};

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

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

相关文章

卷积神经网络 - 卷积层(具体例子)

为了更一步学习卷积神经网络之卷积层&#xff0c;本文我们来通过几个个例子来加深理解。 一、灰度图像和彩色图像的关于特征映射的例子 下面我们通过2个例子来形象说明卷积层中“特征映射”的概念&#xff0c;一个针对灰度图像&#xff0c;一个针对彩色图像。 例子 1&#x…

xlsx.utils.json_to_sheet函数详解

xlsx.utils.json_to_sheet 是 xlsx 库中的一个实用函数&#xff0c;用于将 JSON 数据转换为 Excel 工作表对象。这个函数非常有用&#xff0c;尤其是在你需要从数据库或其他数据源获取数据并将其导出到 Excel 文件时。 函数签名 XLSX.utils.json_to_sheet(data, opts)data&am…

2025-03-17 学习记录--C/C++-PTA 习题4-7 最大公约数和最小公倍数

合抱之木&#xff0c;生于毫末&#xff1b;九层之台&#xff0c;起于累土&#xff1b;千里之行&#xff0c;始于足下。&#x1f4aa;&#x1f3fb; 一、题目描述 ⭐️ 习题4-7 最大公约数和最小公倍数 本题要求两个给定正整数的最大公约数和最小公倍数。 输入格式: 输入在一…

【源码阅读】多个函数抽象为类(实现各种类型文件转为PDF)

目录 一、原始函数二、类三、转换过程 一、原始函数 最开始就是写了几个函数&#xff08;包括doc、excel、ppt类型的文件&#xff09;转换为pdf&#xff0c;需要将这些函数形成一个类。相似的一类函数就可以组成一个实现特定功能的类 import subprocess import pandas as pd i…

VSCode扩展工具Copilot MCP使用教程【MCP】

MCP&#xff08;Model Context Protocol&#xff0c;模型上下文协议&#xff09; &#xff0c;2024年11月底&#xff0c;由 Anthropic 推出的一种开放标准&#xff0c;旨在统一大型语言模型&#xff08;LLM&#xff09;与外部数据源和工具之间的通信协议。本文章教你使用VSCode…

【leetcode100】搜索插入位置

1、题目描述 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 示例 1: 输入: nums [1,3,5,6], target 5 输出: 2…

【小白向】Word|Word怎么给公式标号、调整公式字体和花括号对齐

【小白向】Word&#xff5c;Word怎么给公式标号、调整公式字体和花括号对齐 我的版本&#xff1a;Word 2021 如需快速查看关键步骤&#xff0c;请直接阅读标红部分。 如果遇到无法调整的情况&#xff0c;可以直接下载我的示例文档进行参考&#xff1a;花括号和其他的示例公式.…

【算法day15】最接近的三数之和

最接近的三数之和 给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数&#xff0c;使它们的和与 target 最接近。 这里是引用 返回这三个数的和。 假定每组输入只存在恰好一个解。 https://leetcode.cn/problems/3sum-closest/submissions/61…

Blender-MCP服务源码5-BlenderSocket插件安装

Blender-MCP服务源码5-BlenderSocket插件安装 上一篇讲述了Blender是基于Socket进行本地和远程进行通讯&#xff0c;现在尝试将BlenderSocket插件安装到Blender中进行功能调试 1-核心知识点 将开发的BlenderSocket插件安装到Blender中 2-思路整理 1&#xff09;将SocketServe…

【MySQL数据库】存储过程与自定义函数(含: SQL变量、分支语句、循环语句 和 游标、异常处理 等内容)

存储过程&#xff1a;一组预编译的SQL语句和流程控制语句&#xff0c;被命名并存储在数据库中。存储过程可以用来封装复杂的数据库操作逻辑&#xff0c;并在需要时进行调用。 类似的操作还有&#xff1a;自定义函数、.sql文件导入。 我们先从熟悉的函数开始说起&#xff1a; …

ASP3605抗辐照加固同步降压调节器——商业航天电源芯片解决方案新选择

ASP3605企业宇航级型号ASP3605S2U通过SEU≥75 MeVcm/mg与SEL≥75 MeVcm/mg抗辐射测试。其输入电压4V至15V&#xff0c;输出电流5A&#xff0c;支持多相级联与冗余设计&#xff0c;适用于卫星、航天器电源系统。 面向航天场景的核心功能设计 1. 抗辐射与可靠性保障 单粒子效应…

使用fastapi部署stable diffusion模型

使用vscode运行stable diffusion模型&#xff0c;每次加载模型都需要10分钟&#xff0c;为算法及prompt调试带来了极大麻烦。使用jupyter解决自然是一个比较好的方案&#xff0c;但如果jupyter由于种种原因不能使用时&#xff0c;fastapi无疑成为了一个很好的选择。 参考github…

2025-03-16 学习记录--C/C++-PTA 习题4-4 特殊a串数列求和

合抱之木&#xff0c;生于毫末&#xff1b;九层之台&#xff0c;起于累土&#xff1b;千里之行&#xff0c;始于足下。&#x1f4aa;&#x1f3fb; 一、题目描述 ⭐️ 习题4-4 特殊a串数列求和 给定两个均不超过9的正整数a和n&#xff0c;要求编写程序求aaaaaa⋯aa⋯a&#x…

ffmpeg库视频硬编码使用流程

‌一、硬件编码核心流程‌ ‌硬件设备初始化 // 创建CUDA硬件设备上下文‌ AVBufferRef *hw_device_ctx NULL; av_hwdevice_ctx_create(&hw_device_ctx, AV_HWDEVICE_TYPE_CUDA, NULL, NULL, 0);// 绑定硬件设备到编码器上下文‌ codec_ctx->hw_device_ctx av_buffer_…

【设计模式】3W 学习法全面解析 7 大结构型模式:Java 实战 + 开源框架应用

3W 学习法总结结构型模式&#xff08;附 Java 代码实战及开源框架应用&#xff09; 结构型模式 主要关注 类与对象的组合&#xff0c;确保不同组件之间能够高效协作&#xff0c;提高系统的灵活性和可维护性。本文采用 3W 学习法&#xff08;What、Why、How&#xff09;&#x…

在大数据开发中ETL是指什么?

hello宝子们...我们是艾斯视觉擅长ui设计和前端数字孪生、大数据、三维建模、三维动画10年经验!希望我的分享能帮助到您!如需帮助可以评论关注私信我们一起探讨!致敬感谢感恩! 在数字经济时代&#xff0c;数据已成为企业最核心的资产。然而&#xff0c;分散在业务系统、日志文件…

前端面试项目拷打

Axios相关 1.在Axios二次封装时&#xff0c;具体封装了哪些内容&#xff0c;如何处理请求拦截和响应拦截&#xff1f; axios二次封装的目的&#xff1a;为了统一处理请求和响应拦截器、错误处理、请求超时、请求头配置等&#xff0c;提高代码可维护性和复用性。 首先创建axios…

「JavaScript深入」Server-Sent Events (SSE):轻量级实时通信技术

Server-Sent Events&#xff08;SSE&#xff09; SSE 的特点1. 单向通信2. 简单易用&#xff0c;浏览器原生支持3. 持久连接4. 纯文本传输5. 自动重连机制6. 轻量级协议 SSE 的实现服务器端实现&#xff08;Node.js 示例&#xff09;1. HTTP 响应头设置2. 数据推送模式3. 服务器…

蓝桥杯2023年第十四届省赛真题-阶乘的和

蓝桥杯2023年第十四届省赛真题-阶乘的和 时间限制: 2s 内存限制: 320MB 提交: 3519 解决: 697 题目描述 给定 n 个数 Ai&#xff0c;问能满足 m! 为∑ni1(Ai!) 的因数的最大的 m 是多少。其中 m! 表示 m 的阶乘&#xff0c;即 1 2 3 m。 输入格式 输入的第一行包含一个整…

影刀RPA拓展-Python变量类型转换

1. Python变量类型转换概述 1.1 类型转换的必要性 Python作为一种动态类型语言&#xff0c;在编程过程中经常需要进行变量类型转换。这主要是因为不同数据类型在存储结构、运算规则和使用场景上存在差异&#xff0c;而在实际开发中&#xff0c;我们常常需要对不同类型的数据进…