Qt之QGraphicsView实现思维导图

ops/2025/3/7 5:31:11/

GraphicsView_0">QGraphicsView实现思维导图

1 摘要

GraphicsView框架结构主要包含三个主要的类QGraphicsScene(场景)、QGraphicsView(视图)、QGraphicsItem(图元)。QGraphicsScene本身不可见,是一个存储图元的容器,必须通过与之相连的QGraphicsView视图来显示及与外界进行交互,主要提供图元的操作接口、传递事件和管理各个图元状态,提供无变换的绘制功能(如打印);QGraphicsView提供一个可视的窗口,用于显示场景中的图元,一个场景中可以有多个视图。QGraphicsItem是场景中各个图元的基础类,QT提供了常用图形图元的标准类,如矩形(QGraphicsRectItem)、椭(QGraphicsEllipseItem)、文本(QGraphicsTextItem)。

2 QGraphicsScene 场景

QGraphicsScene场景是QGraphicsItem对象的容器,主要功能如下:
•提供一个快速的接口,用于管理大量图元。
•向每个图元传递事件
•管理图元的状态,如:选中、焦点处理
•提供未进行坐标转换的渲染功能,主要用于打印

通过函数QGraphicsScene::addItem()可以加入一个图元到场景中。图元可以通过多个函数进行检索:QGraphicsScene::items()及重载函数可以返回和点、矩形、多边形或向量路径相交的所有图元。QGraphicsScene::itemAt()返回指定点的最顶层图元。所有图元查找函数按照递减栈顺序返回图元,第一个返回的图元位置最顶层,最后一个返回的图元位于最底层。
QGraphicsScene的事件传播体系将场景事件发送给图元,同时也管理图元之间的事件传播。如果场景收到了在某一点的鼠标单击事件,场景会把事件传给在这一点的最顶层图元。QGraphicsScene负责管理一些图元的状态,如图元选择和焦点。通过QGraphicsScene::setSeletionArea()函数选择多个图元,选择区域可以是任意的形状,使用 QPainterPath表示;要得到当前选择的图元列表可以使用 QGraphicsScene::selectedItems()函数;QGraphicsScene还管理图元的键盘输入焦点状态,可以通过QGraphicsScene::setFocusItem()函数或者QGraphicsItem::setFoucs()函数来设置图元的焦点;获得当前具有焦点的图元使用函数QGraphicsScene::foucsItem()。可以使用 QGraphicsScene::render()函数在绘图设备上绘制场景。

3 思维导图实现

3.1 实现效果图

•启动时创建一个根节点。
•右键点击节点可以添加子节点。
•拖动节点可以移动其位置。
•双击节点可以编辑其标题。
•节点之间会根据父子关系自动绘制连接线。
在这里插入图片描述
选择根节点,为该根节点添加相应的子节点
在这里插入图片描述
选择节点对选择的节点进行删除
在这里插入图片描述
通过鼠标选择节点自由移动,并更新连线
在这里插入图片描述
节点文本更新
在这里插入图片描述
视图缩放功能
在这里插入图片描述
在这里插入图片描述

3.2 实现核心代码

node.h文件代码

#ifndef NODE_H
#define NODE_H#include <QGraphicsEllipseItem>
#include <QGraphicsTextItem>
#include <QString>
#include <QList>
#include <QFont>
class MindMapScene; // 前向声明class Node : public QGraphicsEllipseItem {
public:QString title; // 节点标题QList<Node*> children; // 子节点Node *parentNode; // 父节点QGraphicsTextItem *textItem; // 文本项QFont font; // 字体属性Node(const QString &title, Node *parent = nullptr);void initTextItem();void setFont(const QFont &newFont);protected:void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event) override;void mouseMoveEvent(QGraphicsSceneMouseEvent *event) override; // 重写鼠标移动事件};#endif // NODE_H

node.cpp核心代码

#include "node.h"
#include "mindmapscene.h"
#include <QInputDialog>
#include <QGraphicsSceneMouseEvent>Node::Node(const QString &title, Node *parent): QGraphicsEllipseItem(-25, -25, 50, 50), title(title), parentNode(parent) {setBrush(QBrush(Qt::darkBlue)); // 设置节点填充颜色setPen(QPen(Qt::black)); // 设置节点边框颜色initTextItem(); // 初始化文本项setFlag(QGraphicsItem::ItemIsMovable);     // 允许节点移动setFlag(QGraphicsItem::ItemIsSelectable);  // 允许节点被选中if (parent) {parent->children.append(this); // 将当前节点添加到父节点的子节点列表}}void Node::initTextItem() 
{textItem = new QGraphicsTextItem(title, this);textItem->setPos(-40, -10); // 设置文本项位置textItem->setDefaultTextColor(Qt::yellow); // 设置文本颜色
}void Node::setFont(const QFont &newFont) 
{font = newFont;if (textItem) {textItem->setFont<

http://www.ppmy.cn/ops/163505.html

相关文章

解锁Egg.js:从Node.js小白到Web开发高手的进阶之路

一、Egg.js 是什么 在当今的 Web 开发领域&#xff0c;Node.js 凭借其事件驱动、非阻塞 I/O 的模型&#xff0c;在构建高性能、可扩展的网络应用方面展现出独特的优势 &#xff0c;受到了广大开发者的青睐。它让 JavaScript 不仅局限于前端&#xff0c;还能在服务器端大展身手&…

leetcode面试题-------链表相交

目录 一、题目介绍 二、解题思路 三、代码 一、题目介绍 题目链接&#xff1a;面试题 02.07. 链表相交 - 力扣&#xff08;LeetCode&#xff09; 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点&#x…

如何用 Python 进行机器学习

文章目录 前言1. 环境准备Python安装选择Python开发环境安装必要库 2. 数据收集与加载3. 数据探索与可视化4. 数据预处理5. 模型选择与训练6. 模型评估7. 模型调优8. 模型部署 前言 使用 Python 进行机器学习一般可以按照以下步骤进行&#xff0c;下面将详细介绍每个步骤及对应…

STM32 两个单片机之间的通信

STM32 两个单片机之间的通信 原创 HS 平凡灵感码头 2025年03月04日 11:25 广东 以上我们就是有A B两个板子来进行通信&#xff0c;A板将接收按键的键值&#xff0c;然后发送给B板&#xff0c;B板接收键值&#xff0c;然后判断键值控制LED翻转&#xff0c;然后把键值按字符形式…

创新科技,稀土抑烟剂让聚烯烃更环保

一、什么是稀土抑烟剂&#xff1f; 稀土抑烟剂是一类通过添加稀土元素&#xff08;如铈、镧、钕等&#xff09;来降低材料在燃烧过程中烟雾释放量的添加剂。通过将稀土抑烟剂添加到聚烯烃材料中&#xff0c;不仅能显著减少燃烧时的烟雾排放&#xff0c;还能提高塑料制品的热稳…

【前端】【vue辅助】【vue-tsc】用于 Vue 项目的 TypeScript 检查工具

vue-tsc 是一个用于 Vue 项目的 TypeScript 检查工具&#xff0c;下面介绍它的作用和使用场景&#xff1a; 主要作用 1. 类型检查 vue-tsc 的核心功能是对 Vue 项目中的 TypeScript 代码进行类型检查。在 Vue 项目里&#xff0c;尤其是使用 Vue 3 并结合 TypeScript 开发时&…

沃丰科技结合DeepSeek大模型技术落地与应用前后效果对比

技术突破&#xff1a;DeepSeek算法创新&#xff0c;显著降低了显存占用和推理成本。仅需少量标注数据即可提升推理能力。这种突破减少了对海量数据的依赖&#xff0c;削弱了数据垄断企业的优势&#xff01; 商业模式颠覆&#xff1a;DeepSeek选择完全开源模式&#xff0c;迫使…

政务信息化项目命名有什么门道?

项目名称需精准传递项目的主责单位及应用范围、项目主体内容、项目类型、建设方式等。本视频将结合政策规范与实践案例&#xff0c;解析政务信息化项目命名的核心逻辑。 一、信息化项目命名核心原则 1.准确性。项目命名应充分体现项目在本单位政务信息化规划中的定位&#xf…