前文链接:Qt实现思维导图功能(二)
思维导图文件导入与导出
本文主要涉及文件拖拽窗口的实现和CRC32校验码的生成方法

百度网盘体验地址:
链接:https://pan.baidu.com/s/1ZTPc7klASVXcx69Ekh0gdw
提取码:1v12

效果图
1、动态演示效果:


2、静态展示图片





新增文件导出功能如下

序号 简述 具体功能
1 导出JPEG图片 脑图数据插入JPEG图片中,可导入
2 导出PNG图片 脑图数据插入PNG图片中(支持CRC32数据校验 ),可导入
3 导出PDF文件 无脑图数据,不可导入
4 导出SVG文件 无脑图数据,不可导入
5 导出WORD文件 待做
6 导出TXT文件 待做
7 导出XML文件 脑图数据以Xml格式导出,可导入
8 导出JSON文件 脑图数据以Json格式导出(采用jsoncpp解析,避免QJsonDocument导致数据自动排序),可导入
9 导出脑图文件 待做

新增文件导入功能如下

序号 简述 具体功能
1 支持JPEG格式图片 根据JPEG文件格式,解析JPEG文件/JPG后缀的JPEG格式文件 ,提取脑图数据,展示脑图
2 支持PNG格式图片 根据PNG文件格式(支持CRC32数据校验 ),解析PNG文件 ,提取脑图数据,展示脑图
3 支持XML文件 解析XML文件 ,提取脑图数据,展示脑图
4 支持JSON文件 解析JSON文件(采用jsoncpp解析,避免QJsonDocument导致数据自动排序) ,提取脑图数据,展示脑图

核心代码
1、文件拖拽窗口(作为文件导入窗口的中心窗口)

#pragma once/** 思维导图-文件拖放窗口*/#include <QWidget>class DropFileWidget : public QWidget
{Q_OBJECTpublic:DropFileWidget(QWidget *parent = nullptr);~DropFileWidget();// 清空数据void clear();// 获取文件名QString getFileName();protected:void paintEvent(QPaintEvent *event);void dragEnterEvent(QDragEnterEvent *event);void dragLeaveEvent(QDragLeaveEvent *event);void dropEvent(QDropEvent *event);private:bool m_drag;             // 是否拖拽bool m_isMindFile;           // 是否是导图文件(是否包含导图信息)bool m_existMindFile;     // 是否已拖入过导图文件QString m_mindFileName;        // 导图文件名QColor m_bgColor;           // 背景色QColor m_mindFileColor;       // 导图文件颜色QColor m_otherFileColor;   // 其他文件颜色
};
#include "DropFileWidget.h"
#include <QPainter>
#include <QDragEnterEvent>
#include <QMimeData>
#include <QFileInfo>
#include "Tool/MindFileUtility.h"#pragma execution_character_set("UTF-8")DropFileWidget::DropFileWidget(QWidget *parent/* = nullptr*/): QWidget(parent)
{m_drag = false;                               // 是否拖拽m_isMindFile = false;                       // 是否是导图文件(是否包含导图信息)m_existMindFile = false;                 // 是否已拖入过导图文件m_bgColor = QColor(243, 243, 243);            // 背景色m_mindFileColor = QColor(238, 244, 255); // 导图文件颜色m_otherFileColor = QColor(255, 0, 0, 58); // 其他文件颜色setAcceptDrops(true);
}DropFileWidget::~DropFileWidget()
{
}void DropFileWidget::clear()
{m_drag = false;               // 是否拖拽m_isMindFile = false;       // 是否是导图文件(是否包含导图信息)m_existMindFile = false; // 是否已拖入过导图文件m_mindFileName = "";
}QString DropFileWidget::getFileName()
{return m_mindFileName;
}void DropFileWidget::paintEvent(QPaintEvent *event)
{Q_UNUSED(event)int width = this->width();int height = this->height();int size = qMin(width, height);QPainter painter(this);painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing);// 绘制背景painter.setPen(Qt::NoPen);painter.setBrush(QBrush(m_isMindFile ? m_mindFileColor : (m_drag ? m_otherFileColor : m_bgColor)));painter.drawRect(rect());if (!m_existMindFile){// 绘制文本QFont font = painter.font();font.setPixelSize(24);painter.setFont(font);painter.setPen(m_isMindFile ? Qt::green : (m_drag ? Qt::red : Qt::gray));QString text = m_isMindFile ? "文件格式正确" : (m_drag ? "文件格式错误" : "拖放文件至此");painter.drawText(rect(), Qt::AlignCenter, text);}else{QFileInfo fileInfo(m_mindFileName);QString suffix = fileInfo.suffix().toUpper();// 绘制图片QRect pixmapRect(width / 2 - size * 0.3, size * 0.1, size * 0.6, size * 0.6);painter.drawPixmap(pixmapRect, QPixmap(QString(":/QWHMindMap/Res/img/ExportMind/%1.png").arg(suffix)));// 绘制文本QRect textRect(0, size * 0.7, width, size * 0.2);painter.setPen(Qt::black);painter.drawText(textRect, Qt::AlignCenter, fileInfo.fileName());}
}void DropFileWidget::dragEnterEvent(QDragEnterEvent *event)
{clear();// 获取文件名,解析是否是导图文件m_mindFileName = event->mimeData()->urls().first().toLocalFile();m_isMindFile = MindFileUtility::isMindFile(m_mindFileName);event->acceptProposedAction();update();
}void DropFileWidget::dragLeaveEvent(QDragLeaveEvent *event)
{clear();update();
}void DropFileWidget::dropEvent(QDropEvent *event)
{m_drag = false;if (m_isMindFile)m_existMindFile = true;update();
}

2、生成CRC32校验码

#pragma once/** 思维导图-CRC32工具类* 对于data_len + data_type + data_content + data_crc结构的PNG数据* CRC解析的是data_type + data_content部分,不需要data_len部分,当然更不会需要data_crc部分*/class CRC32
{
public:// 码表生成,如:X32+X26+...X1+1, poly=(1<<26)|...|(1<<1)|(1<<0)static void initCrc32Table(unsigned long poly);// 获取CRC32校验码,crc默认初始值0xFFFFFFFFstatic unsigned long crc32(unsigned char *input, int len);// 生成多项式G(x) = x32+x26+x23+x22+x16+x12+x11+x10+x8+x7+x5+x4+x2+x+1static unsigned long CRC32::poly;  // 生成多项式代码private:// 位逆转static unsigned long bitReverse(unsigned long input, int bw);// 获取CRC32校验码static unsigned long crc32(unsigned long crc, unsigned char *, int len);private:static unsigned long table[256];  // 校验码表static unsigned long crc;            // 初始值
};
#include "CRC32.h"unsigned long CRC32::table[256] = {0};  // 校验码表
unsigned long CRC32::crc = 0xFFFFFFFF; // 初始值
unsigned long CRC32::poly = 0x4C11DB7; // 生成多项式代码,由G(x)演化而来void CRC32::initCrc32Table(unsigned long poly)
{unsigned long c;poly = bitReverse(poly, 32);for (int i = 0; i < 256; i++){c = i;for (int j = 0; j < 8; j++){if (c & 1)c = poly ^ (c >> 1);elsec = c >> 1;}table[i] = c;}
}unsigned long CRC32::bitReverse(unsigned long input, int bw)
{unsigned long var = 0;for (int i = 0; i < bw; i++){if (input & 0x01){var |= 1 << (bw - 1 - i);}input >>= 1;}return var;
}unsigned long CRC32::crc32(unsigned long crc, unsigned char *input, int len)
{unsigned char index;unsigned char *pch = input;for (int i = 0; i < len; i++){index = (unsigned char)(crc ^ *pch);crc = (crc >> 8) ^ table[index];pch++;}return crc;
}unsigned long CRC32::crc32(unsigned char *input, int len)
{return crc32(crc, input, len);
}

Qt实现思维导图功能(三)相关推荐

  1. Qt实现思维导图功能(二)

    前文链接:Qt实现思维导图功能(一) 百度网盘体验地址: 链接:https://pan.baidu.com/s/1-be0tDJokpZeqhMEuHQntA 提取码:4d1w 注:UI窗体风格参考软 ...

  2. Qt之使用GraphicsView框架实现思维导图功能

    一.简述 我们常见的思维导图类型XMind软件,功能十分强大,提供了各式各样的导图样式.形式,那我们可以用Qt实现思维导图的功能吗,答案肯定是可以的,用图说明. 1.静态方式 读取本地数据的方式进行展 ...

  3. 思维导图的三招十八式

    思维导图的三招十八式  张鄂勇 编著 ISBN978-7-121-14010-5 2012年1月出版 定价:49.00元 16开 396页 宣传语:会降龙十八掌,才混得到九袋弟子.         懂 ...

  4. 思维导图的三招十八式之梳理

    说到思维导图的三招十八式,很多人都希望用它来学习思维导图,里面讲解了很多MindManager和MindMapper的使用方法和技巧,不过,撇除这些,思维导图的三招十八式这本书也是蛮厚实的,想要快速了 ...

  5. 思维导图培训三:思维导图的应用

    思维导图培训三:思维导图的应用 在这个商业社会,个人的价值的体现必须放在社会成功的天平上进行衡量! 这就给各类成功人士提供了一个用自己的成功经验赚钱的机会,他们出书或者办班,向听众大讲特讲许许多多成功 ...

  6. 【无限思维画布】制作思维导图第三步,节点移动与编辑

    正在为无限词典制作单词思维导图功能,实现无限单词导图,无限思维画布.目前制作到第三步,实现节点移动与编辑: 节点移动与编辑 Details 第一步,搜索 github. 一个是比较完善的,基于普通do ...

  7. 《思维导图的三招十八式》读书笔记

    1.书籍信息 --------------------------------------------------------- 书籍名称:思维导图的三招十八式 作者:张鄂勇 出版社:电子工业出版社 ...

  8. [思维导图学习三] 思维导图的应用

    在这个商业社会,个人的价值的体现必须放在社会成功的天平上进行衡量! 这就给各类成功人士提供了一个用自己的成功经验赚钱的机会,他们出书或者办班,向听众大讲特讲许许多多成功必需的所谓品质或条件. 那么,我 ...

  9. 画思维导图的三招十八式

    思维导图在生活中是一种很常见的图表,因为它的实用性所以使用的人越来越多,但是怎么样绘制思维导图却成为了困扰的问题,下面小编给大家分享画思维导图的两种操作方法. 绘制工具:电脑 迅捷画图 操作方法介绍: ...

最新文章

  1. 认识jQuery及jQuery选择器
  2. 2019日历全年一张_带上这份2019全年活动日历,旅行打卡不迷路
  3. 牛津英语3a_空中课堂 | 牛津英语学霸笔记3A M3U2
  4. [SDOI2017]数字表格
  5. 把一维数组处理成二维数组
  6. php双引号解析漏洞
  7. IP-GUARD内网安全监管系统
  8. Redis集群搭建与简单使用
  9. 如何充分利用好大数据的价值
  10. php易宝支付扫码支付代码_谈谈扫码支付
  11. java生成xps文件_Java 将 Excel 转为PDF、图片、html、XPS、XML、CSV
  12. java语法分析器_JavaCC语法分析器
  13. 合作式智能运输系统通信架构
  14. 联想小新300加固态_Lenovo 联想 小新310 硬盘移位加装SSD
  15. 网页制作学习3----实现连缀功能
  16. ikbc pocker键盘 快捷键说明
  17. 观《哪吒之魔童降世》有感
  18. MySQL数据库,数据的约束
  19. 【Mac 教程系列第 9 篇】如何把 Mac 中的程序坞移动到另一个屏幕
  20. 浅谈js开源库jQuery

热门文章

  1. (西安电子科技大学,汤小丹等)计算机操作系统——第二章、进程的描述与控制
  2. 2022-2027年中国冷冻果汁行业发展监测及投资战略研究报告
  3. is running 8724480B beyond the ‘PHYSICAL‘ memory limit.
  4. 在opencv2.4.x版本中处理图像EXIF orientation不统一的问题
  5. vtkImagePlaneWidget:only works for ortho planes: set plane orientation first
  6. Scrapy爬虫实战:使用代理访问
  7. 存储--盘古,阿里云飞天分布式存储系统设计深度解析
  8. 修改SQL Server 2005 数据库文件名字
  9. mysqld,mysqld_safe,mysql.server,mysqladmin,mysql,service mysql的理解
  10. tensorflow 降级