Qt之使用GraphicsView框架实现思维导图的示例

 更新时间:2022年05月11日 14:17:35   作者:前行中的小猪  
思维导图可以更方便的整理知识,本文主要介绍了Qt之使用GraphicsView框架实现思维导图的示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

一、简述

我们常见的思维导图类型XMind软件,功能十分强大,提供了各式各样的导图样式、形式,那我们可以用Qt实现思维导图的功能吗,答案肯定是可以的,用图说明。

1、静态方式

读取本地数据的方式进行展示。

在这里插入图片描述

2、优化

(1)增加选中效果
(2)优化连接线条

在这里插入图片描述

3、动态方式

(1)可自由添加/删除节点
(2)双击可重命名节点
(3)可折叠节点
(4)每层节点颜色可自定义
(5)支持xml格式数据的保存/读取(可拓展为其他格式或数据库)

在这里插入图片描述

在这里插入图片描述

线条绘制Code

void LineTest::paintEvent(QPaintEvent *event)
{
	QPoint startPoint = m_startPoint;
	QPoint endPoint = m_endPoint;
	int hSpace = 15;
	int radius = 8;

	QPainter painter(this);
	painter.setRenderHint(QPainter::Antialiasing, true);
	painter.setPen(QPen(Qt::gray, 2, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin));
	// 判断是上弧线还是下弧线;
	if (endPoint.y() < startPoint.y())
	{
		// 绘制横线;
		painter.drawLine(startPoint, startPoint + QPoint(hSpace, 0));

		// 绘制竖线;
		startPoint += QPoint(hSpace, 0);
		QPoint vTopPoint = QPoint(startPoint.x(), endPoint.y() + radius);
		painter.drawLine(startPoint, vTopPoint);

		// 绘制上弧线;
		startPoint = vTopPoint;
		QPoint hTopPoint = QPoint(startPoint.x() + radius, endPoint.y());

		QPainterPath path(startPoint);
		// 绘制贝塞尔三次曲线;
		QPointF c1 = QPointF(startPoint.x(), hTopPoint.y());
		QPointF c2 = QPointF(startPoint.x() + 2, hTopPoint.y() + 2);
		path.cubicTo(c2, c2, hTopPoint);
		painter.drawPath(path);
		
		// 绘制横线;
		startPoint = hTopPoint;
		painter.drawLine(startPoint, endPoint);
	}
	else if (endPoint.y() > startPoint.y())
	{
		// 绘制横线;
		painter.drawLine(startPoint, startPoint + QPoint(hSpace, 0));

		// 绘制竖线;
		startPoint += QPoint(hSpace, 0);
		QPoint vBottomPoint = QPoint(startPoint.x(), endPoint.y() - radius);
		painter.drawLine(startPoint, vBottomPoint);

		// 绘制下弧线;
		startPoint = vBottomPoint;
		QPoint hBottomPoint = QPoint(startPoint.x() + radius, endPoint.y());

		QPainterPath path(startPoint);
		// 绘制贝塞尔三次曲线;
		QPointF c1 = QPointF(startPoint.x() + 2, hBottomPoint.y() - 2);
		QPointF c2 = QPointF(startPoint.x() + 2, hBottomPoint.y() + 2);
		path.cubicTo(c1, c1, hBottomPoint);
		painter.drawPath(path);

		// 绘制横线;
		startPoint = hBottomPoint;
		painter.drawLine(startPoint, endPoint);
	}
	else
	{
		// 绘制直线;
		painter.drawLine(startPoint, endPoint);
	}
}

目前只实现了初步导图的基础功能,后续会增加更多的样式选择及拓展。

到此这篇关于Qt之使用GraphicsView框架实现思维导图的示例的文章就介绍到这了,更多相关Qt GraphicsView思维导图内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 简述C++的复杂性

    简述C++的复杂性

    这篇文章主要介绍了简述C++的复杂性,帮助大家更好的理解和认识c++编程语言,感兴趣的朋友可以了解下
    2020-08-08
  • C语言实现解析csv格式文件的示例代码

    C语言实现解析csv格式文件的示例代码

    CSV,有时也称为字符分隔值,其文件以纯文本形式存储表格数据(数字和文本),本文为大家整理了C语言解析csv文件的方法,需要的可以参考一下
    2023-06-06
  • C++ push方法与push_back方法常见方法介绍

    C++ push方法与push_back方法常见方法介绍

    push与push_back是STL中常见的方法,都是向数据结构中添加元素,本文还将简述push对应的stack与queue系列,常见方法的介绍,以及与push_back相对应的vector系列常见方法介绍,感兴趣的朋友跟随小编一起看看吧
    2022-11-11
  • C语言中栈的两种实现方法

    C语言中栈的两种实现方法

    栈的实现方式有两种,一种方法是使用指针,而另一种方法则是使用数组,这篇文章主要介绍了C语言中栈的两种实现方法,需要的朋友可以参考下
    2021-08-08
  • C语言指针原来也可以这样了解

    C语言指针原来也可以这样了解

    这篇文章非常详细的讲解了C语言中指针的概念,包含多种方法,多种定义,全面的说明了C语言的特性,希望能给你带来帮助
    2021-08-08
  • C++中最常用的容器用法与排序实例

    C++中最常用的容器用法与排序实例

    C++ 中容器被定义为:在数据存储上,有一种对象类型,它可以持有其它对象或指向其它对像的指针,这种对象类型就叫做容器,这篇文章主要给大家介绍了关于C++中最常用的容器用法与排序的相关资料,需要的朋友可以参考下
    2021-08-08
  • C++实现将数据写入Excel工作表的示例代码

    C++实现将数据写入Excel工作表的示例代码

    直观的界面、出色的计算功能和图表工具,使Excel成为最流行的个人计算机数据处理软件。在本文中,您将学习如何使用 Spire.XLS for C++ 创建 Excel 文档,以及如何将数据写入 Excel 工作表
    2023-03-03
  • 关于C++动态分配内存的介绍

    关于C++动态分配内存的介绍

    今天小编就为大家分享一篇关于关于C++动态分配内存的介绍,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • C语言中的内联函数(inline)与宏定义(#define)详细解析

    C语言中的内联函数(inline)与宏定义(#define)详细解析

    内联函数与宏本质上是两个不同的概念如果程序编写者对于既要求快速,又要求可读的情况下,则应该将函数冠以inline
    2013-09-09
  • c++中stack、queue和vector的基本操作示例

    c++中stack、queue和vector的基本操作示例

    这篇文章主要给大家介绍了关于c++中stack、queue和vector基本操作的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面跟着小编来一起学习学习吧。
    2017-08-08

最新评论