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

Qt之QGraphicsView实现思维导图

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<

相关文章:

  • 爬虫逆向:脱壳工具 frida-dexdump 的使用详解
  • [总概]Vue2/3React Diff算法
  • centos8更换阿里云yum源
  • synchronized锁的原理
  • Linux12-UDP\TCP
  • 前端常用的设计模式
  • 工程化与框架系列(21)--前端性能优化(上)
  • SQL 窗口函数之lead() over(partition by ) 和 lag() over(partition by )
  • Unity 实现在模型表面进行绘画
  • Python接口自动化之断言封装!
  • TikTok美国战略升级:聚焦美食旅行,本地化服务如何重塑市场格局
  • 跟着 Lua 5.1 官方参考文档学习 Lua (10)
  • 【SpringBoot】深入解析 Maven 的操作与配置
  • SpringBoot集成Sentry日志收集-1 (Sentry安装)
  • 如何不重启,生效windows环境变量
  • 力扣刷题DAY6(滑动窗口/中等+栈/简单、中等)
  • springboot 集成 MongoDB 基础篇
  • 基于SpringBoot+Vue的校园美食分享平台的设计与实现
  • Redis 脚本:高效数据管理的利器
  • Python 配置文件解析利器:configparser 使用指南
  • 重庆优化网站/今天发生的重大新闻内容
  • 北京靠谱的网站公司/佛山旺道seo
  • 哪家公司网站做的比较好/seo快速排名培训
  • 东莞找工作/百度搜索排名优化
  • 企业网站建设公司/营销策划公司简介
  • 网网站设计网/2021百度seo