qt-C++笔记之创建和初始化 `QGraphicsScene` 和 `QGraphicsView` 并关联视图和场景的方法
qt-C++笔记之创建和初始化 QGraphicsScene 和 QGraphicsView 并关联视图和场景的方法

code review!
参考笔记
1.qt-C++笔记之创建和初始化 QGraphicsScene 和 QGraphicsView 并关联视图和场景的方法
2.qt-C++笔记之QGraphicsScene和 QGraphicsView中setScene、通过scene得到view、通过view得scene
文章目录
- qt-C++笔记之创建和初始化 `QGraphicsScene` 和 `QGraphicsView` 并关联视图和场景的方法
- 1. 栈分配 `QGraphicsScene` 和 `QGraphicsView`
- 2. 堆分配 `QGraphicsScene` 和 `QGraphicsView`
- 3. 堆分配 `QGraphicsScene`,栈分配 `QGraphicsView`
- 4. 堆分配并利用父子关系管理
- 5. 使用 Qt Designer 通过 UI 文件创建(推荐方式之一)
- 总结比较
- 推荐使用方式
在使用 Qt 开发图形界面应用程序时,
QGraphicsScene 和
QGraphicsView 是处理和显示图形项的核心类。正确地创建和初始化这两个类对于应用程序的性能和内存管理至关重要。本节将详细介绍创建和初始化
QGraphicsScene 和
QGraphicsView 的常见方式,分析它们之间的关系,并讨论不同内存分配方式的优缺点及适用场景。
1. 栈分配 QGraphicsScene 和 QGraphicsView
QGraphicsScene scene;
QGraphicsView view(&scene);
特点
- 栈上分配:
scene和view都是在栈上分配的对象。 - 作用域管理:它们的生命周期由所在的作用域控制,离开作用域时会自动销毁。
- 关联方式:
view在构造函数中接受scene的地址,直接关联二者。
优点
- 自动内存管理:不需要手动释放内存,避免了内存泄漏的风险。
- 简单易用:代码简洁明了,适合快速开发。
缺点
- 栈内存有限:栈内存空间较小,如果场景中包含大量图形项,可能导致栈溢出。
- 生命周期受限:无法在作用域之外使用
scene或view,限制了它们的可用范围。
适用场景
- 短生命周期的应用:如小型工具或临时演示程序。
- 简单场景:不需要大量图形项或复杂交互的情况。
2. 堆分配 QGraphicsScene 和 QGraphicsView
QGraphicsScene *scene = new QGraphicsScene();
QGraphicsView *view = new QGraphicsView(scene);
特点
- 堆上分配:
scene和view都是在堆上动态分配的对象。 - 手动内存管理:需要开发者在合适的时机手动释放内存(通常使用
delete)。 - 关联方式:
view通过构造函数接受scene的指针,建立关联。
优点
- 灵活性高:可以动态管理对象的生命周期,适应复杂的应用需求。
- 长期存在:适合需要在整个程序生命周期中存在的场景和视图。
缺点
- 内存管理复杂:需要手动释放内存,容易出现内存泄漏或悬空指针。
- 错误风险高:释放顺序不当可能导致未定义行为,需要仔细管理。
适用场景
- 复杂应用程序:需要动态创建和销毁大量场景和视图的程序。
- 资源管控:需要精细控制内存和资源的分配与释放。
3. 堆分配 QGraphicsScene,栈分配 QGraphicsView
QGraphicsScene *scene = new QGraphicsScene();
QGraphicsView view(scene);
特点
- 混合分配:
scene在堆上动态分配,view在栈上分配。 - 部分手动管理:
scene需要手动释放内存,view由作用域自动管理。
优点
- 视图自动管理:
view不需要手动释放,减少了内存管理的负担。 - 长寿命场景:适合场景需要长期存在,但视图是临时的情况。
缺点
- 场景内存管理:
scene的内存需要手动释放,可能导致内存泄漏。 - 关联风险:在
view销毁后继续使用scene时,需确保其合法性。
适用场景
- 临时视图:需要在不同地方显示同一场景的短期视图。
- 共享场景:多个视图共享一个长期存在的场景。
4. 堆分配并利用父子关系管理
QGraphicsScene *scene = new QGraphicsScene();
QGraphicsView *view = new QGraphicsView(scene);
view->setScene(scene); // 可选,如果构造函数已设置,可省略
特点
- 堆上分配:
scene和view都在堆上动态分配。 - 父子关系管理:通过 Qt 的对象树机制,
view作为父对象,scene作为子对象。 - 自动内存管理:当父对象销毁时,子对象会自动销毁。
优点
- 减少内存泄漏:利用父子关系,自动管理内存,降低内存泄漏风险。
- 结构清晰:对象间的关系明确,便于维护。
缺点
- 依赖父子关系:需要确保正确设置父子关系,否则内存管理仍需手动处理。
- 复杂性增加:在复杂应用中,需要仔细设计对象间的关系。
适用场景
- 长期存在的复杂应用:需要稳定且生命周期较长的场景和视图。
- 多层次对象管理:适用于对象间存在明显的层次关系的程序。
5. 使用 Qt Designer 通过 UI 文件创建(推荐方式之一)
在 Qt Designer 中,可以直接设计和布局 QGraphicsView,然后在代码中动态创建并关联 QGraphicsScene。
步骤
- 在 Qt Designer 中设计界面:
- 拖放一个
QGraphicsView到 UI 界面中。
- 拖放一个
- 在代码中设置场景:
QGraphicsScene *scene = new QGraphicsScene(this); // this 通常是指主窗口
ui->graphicsView->setScene(scene);
特点
- 可视化设计:利用 Qt Designer 直观地设计界面布局。
- 父子关系管理:
scene的父对象设置为主窗口,自动管理内存。
优点
- 代码简洁:界面布局和代码逻辑分离,代码更清晰。
- 自动内存管理:借助父子关系,减少内存泄漏的风险。
缺点
- 学习成本:需要熟悉 Qt Designer 和 UI 文件的使用方法。
- 灵活性:某些动态布局可能不如手写代码灵活。
适用场景
- UI 集中管理的项目:界面复杂且需要频繁调整的应用程序。
- 团队协作:设计人员和开发人员分工合作的项目。
总结比较
| 方式 | 场景分配 | 视图分配 | 内存管理 | 适用场景 |
|---|---|---|---|---|
| 1. 栈分配场景和视图 | 栈 | 栈 | 自动管理 | 简单、短生命周期的场景 |
| 2. 堆分配场景和视图 | 堆 | 堆 | 手动管理 | 长期存在、复杂的场景 |
| 3. 堆分配场景 + 栈分配视图 | 堆 | 栈 | 部分手动管理 | 临时视图,长期存在的场景 |
| 4. 堆分配并利用父子关系管理 | 堆 | 堆 | 父子关系自动管理 | 复杂项目,长期存在的视图和场景 |
| 5. 使用 Qt Designer 通过 UI 文件创建 | 可选(堆) | 可选(堆) | 父子关系自动管理 | 使用 Qt Designer 的项目 |
推荐使用方式
- 简单程序:如果是简单的、短期的程序,建议使用 方式 1,即栈上分配,自动管理内存,代码简洁。
- 复杂程序:对于大型或复杂的应用程序,推荐使用 方式 4 或 方式 5,结合父子关系和 Qt Designer,既有利于内存管理,又能提高开发效率。
- 需要动态管理生命周期:如果需要在运行时动态创建和销毁场景或视图,可以考虑 方式 2 或 方式 3,但要注意正确管理内存,防止泄漏。
通过对以上五种方式的分析,可以根据具体的应用需求和项目规模,选择最适合的创建和初始化 QGraphicsScene 和 QGraphicsView 的方法。这不仅有助于提高程序的性能和稳定性,还能降低内存泄漏和其他潜在问题的风险。
在实际开发中,遵循良好的内存管理原则,充分利用 Qt 的父子对象机制,以及借助工具(如 Qt Designer)进行界面设计,都能提高开发效率和代码质量。
相关文章:
qt-C++笔记之创建和初始化 `QGraphicsScene` 和 `QGraphicsView` 并关联视图和场景的方法
qt-C笔记之创建和初始化 QGraphicsScene 和 QGraphicsView 并关联视图和场景的方法 code review! 参考笔记 1.qt-C笔记之创建和初始化 QGraphicsScene 和 QGraphicsView 并关联视图和场景的方法 2.qt-C笔记之QGraphicsScene和 QGraphicsView中setScene、通过scene得到view、通过…...
OpenGL 01--构建GLFW、创建第一个工程、配置GLAD
一、OpenGL介绍 一般它被认为是一个API(Application Programming Interface, 应用程序编程接口),包含了一系列可以操作图形、图像的函数。然而,OpenGL本身并不是一个API,它仅仅是一个由Khronos组织制定并维护的规范(Specification)。 OpenGL规…...
【时时三省】(C语言基础)求多项式1-1/2+1/3-1/4+...+1/99-1/100的值 用C语言表示
山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省 示例: 输出结果是 0.688172...
kafka-集群缩容
一. 简述: 当业务增加时,服务瓶颈,我们需要进行扩容。当业务量下降时,为成本考虑。自然也会涉及到缩容。假设集群有 15 台机器,预计缩到 10 台机器,那么需要做 5 次缩容操作,每次将一个节点下线…...
Ubuntu22.04 - etcd的安装和使用
目录 介绍安装Etcd安装etcd的客户端使用 介绍 Etcd 是一个 golang 编写的分布式、高可用的一致性键值存储系统,用于配置共享和服务发现等。它使用 Raft 一致性算法来保持集群数据的一致性,且客户端通过长连接watch 功能,能够及时收到数据变化…...
排查JVM的一些命令
查看JVM相关信息的方法 环境: Win10, jdk17 查看端口的Pid netstat -ano | findstr <端口号>列出当前运行的JVM进程 ## 用于输出JVM中运行的进程状态信息。通过jps,可以快速获取Java进程的PID(进程标识符), …...
Apache Doris 实现毫秒级查询响应
1. 引言 1.1 数据分析的重要性 随着大数据时代的到来,企业对实时数据分析的需求日益增长。快速、准确地获取数据洞察成为企业在竞争中脱颖而出的关键。传统的数据库系统在处理大规模数据时往往面临性能瓶颈,难以满足实时分析的需求。例如,一个电商公司需要实时监控销售数据…...
Java 与设计模式(15):模板方法模式
一、定义 模板方法模式是一种行为设计模式,它定义了一个操作中的算法的骨架(也就是大致的步骤和流程),而将一些具体步骤的实现延迟到子类中。这样,子类可以不改变算法的结构即可重新定义算法的某些特定步骤。 二、Ja…...
Arduino 第十六章:pir红外人体传感器练习
Arduino 第十六章:PIR 传感器练习 一、引言 在 Arduino 的众多有趣项目中,传感器的应用是非常重要的一部分。今天我们要学习的主角是 PIR(被动红外)传感器。PIR 传感器能够检测人体发出的红外线,常用于安防系统、自动…...
C++中间件DDS介绍
C DDS 库简介 DDS(Data Distribution Service) 是一种用于实时分布式系统通信的中间件标准,由 OMG(Object Management Group) 提出。它是一种发布/订阅(Publish/Subscribe)模式的数据通信框架&…...
自动化之ansible(二)
一、ansible中playbook(剧本) 官方文档: Ansible playbooks — Ansible Community Documentation 1、playbook的基本结构 一个基本的playbook由以下几个主要部分组成 hosts: 定义要执行任务的主机组或主机。 become: 是否需要使用超级用户…...
QSNCTF-WEB做题记录
第一题,文章管理系统 来自 <天狩CTF竞赛平台> 描述:这是我们的文章管理系统,快来看看有什么漏洞可以拿到FLAG吧?注意:可能有个假FLAG哦 1,首先观察题目网站的结构和特征 这个一个文件管理系统&#x…...
Ruoyi-Vue 3.8.7集成积木报表JmReport和积木大屏JimuBI
Ruoyi-Vue 3.8.7集成积木报表JmReport和积木大屏JimuBI 一、版本 RuoYi-Vue版本:v3.8.7 JMreport报表版本: v1.9.4 JimuBI大屏版本:V1.9.4 二、数据库 积木数据库sql 下载后,使用数据库管理工具执行sql脚本,将需…...
OSPF(开放路径最短优先)
ospf优先级:内部优先级默认为10,外部优先级默认为150 1.ospf的三张表 (1)邻居表 <记录邻居状态和关系> (2)拓扑表 <链路状态数据库> (3)路由表 <对链路状态数据库进…...
请谈谈 Vue 中的响应式原理,如何实现?
一、Vue2响应式原理:Object.defineProperty的利与弊 实现原理: // 数据劫持核心实现 function defineReactive(obj, key, val) {const dep new Dep(); // 依赖收集容器Object.defineProperty(obj, key, {get() {if (Dep.target) { // 当前Watcher实例…...
亲测可用,IDEA中使用满血版DeepSeek R1!支持深度思考!免费!免配置!
作者:程序员 Hollis 之前介绍过在IDEA中使用DeepSeek的方案,但是很多人表示还是用的不够爽,比如用CodeChat的方案,只支持V3版本,不支持带推理的R1。想要配置R1的话有特别的麻烦。 那么,今天,给…...
jvm中各个参数的理解
MEMORY - MANAGERS 定义 MEMORY - MANAGERS即内存管理器,它是操作系统或软件系统中负责管理计算机内存资源的组件。从本质上来说,它是一种软件机制,旨在协调计算机系统中内存的分配、使用和回收等操作,确保系统能够高效、稳定地…...
【队列】循环队列(Circular Queue)详解
文章目录 一、循环队列简介二、循环队列的判空和判满三、循环队列的实现leetcode 622. 设计循环队列 一、循环队列简介 在实际开发中,队列是一种常用的数据结构,而循环队列(Circular Queue)则一般是一种基于数组实现的队列&#x…...
Deepseek快速做PPT
背景: DeepSeek大纲生成 → Kimi结构化排版 → 数据审查,细节调整 DeepSeek 拥有深度思考能力,擅长逻辑构建与内容生成,它会根据我们的问题进行思考,其深度思考能力当前测试下来,不愧为国内No.1,而且还会把中间的思考过程展示出来,大多时候会给出很多我们意想不到的思…...
DeepSeek掀起推理服务器新风暴,AI应用迎来变革转折点?
AI 浪潮下,推理服务器崭露头角 在科技飞速发展的当下,AI 是耀眼明星,席卷各行业,深刻改变生活与工作模式,从语音助手到医疗诊断、金融风险预测,AI 无处不在。其发展分数据收集整理、模型训练、推理应用三个…...
离线部署大模型:ollama+deepseek+open-webui
ollama 是一个开源的本地大语言模型运行框架,它提供了非常简单便捷的使用形式,让用户可以十分方便的在本地机器上部署和运行大型语言模型,从而实现免费离线的方式使用 LLM 能力,并确保私有数据的隐私和安全性。 1 ollama 安装 o…...
深入解析浏览器渲染全流程:从URL输入到页面渲染的底层原理与性能优化(附实战代码)
本文以https://example.com为例,逐层剖析浏览器从输入URL到页面渲染的完整链路,涵盖DNS解析、TCP/TLS握手、HTTP请求、DOM/CSSOM构建等核心阶段,结合代码示例与性能调优技巧,助你掌握浏览器底层运行机制。 一、导航阶段࿱…...
现代游戏UI架构深度解析——以UIController为核心的模块化界面管理系统
一、架构全景与设计哲学 本文将以重构后的UIController为核心,深入探讨Unity引擎下的高效UI管理方案。该体系采用"分层-分治"设计理念,通过界面生命周期管理、动态适配策略、资源优化机制三个维度的协同工作,构建了适应复杂交互需…...
Vue 项目中逐步引入 TypeScript 的类型检查
在现有的 Vue 项目中逐步引入 TypeScript 的类型检查 本文源于一道面试题:注:两种问法一个意思哈!! 问题一:“ 老项目Js写的,如何轻量方式享受 ts 类型?” 问题二:“如何 在现有的 …...
Git企业开发
Git(版本控制器) 在我们对于文档进行操作的时候,很多时候可能会出现多个文档,对这些文档进行多个版本的保存和记录就变成必要的。通俗的讲,就是记录每次的修改和记录版本迭代的管理系统。目前最主流的版本控制器就是G…...
DeepSeek预测25考研分数线
25考研分数马上要出了。 目前,多所大学已经陆续给出了分数查分时间,综合往年情况来看,每年的查分时间一般集中在2月底。 等待出成绩的日子,学子们的心情是万分焦急,小编用最近爆火的“活人感”十足的DeepSeek帮大家预…...
备战蓝桥杯 -牛客
习题-[NOIP2006]明明的随机数 1046-习题-[NOIP2006]明明的随机数_2021秋季算法入门班第一章习题:模拟、枚举、贪心 思路:这道题用stl的set,今天写这道题复习了一下set的用法: s.find(a) s.end()的意思是判断元素a是否存在于集…...
基于springboot校园健康系统的设计与实现(源码+文档)
大家好我是风歌,今天要和大家聊的是一款基于springboot的园健康系统的设计与实现。项目源码以及部署相关请联系风歌,文末附上联系信息 。 项目简介: 基于springboot校园健康系统的设计与实现的主要使用者管理员具有最高的权限,通…...
出现 [ app.json 文件内容错误] app.json: 在项目根目录未找到 app.json (env: Windows,mp 解决方法
目录 1. 问题所示2. 原理分析3. 解决方法1. 问题所示 hbuilder X 执行代码的时候出现如下所示 [ app.json 文件内容错误] app.json: 在项目根目录未找到 app.json (env: Windows,mp,1.06.2412050; lib:...
设计模式教程:责任链模式(Chain of Responsibility Pattern)
责任链模式(Chain of Responsibility Pattern)是一种常用的设计模式,它属于行为型模式,主要解决的是多个对象处理一个请求时,如何解耦请求的发送者和接收者,以及如何将请求的处理职责分配给不同的对象。 1…...
