Qt实现思维导图功能(三)
前文链接: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实现思维导图功能(三)相关推荐
- Qt实现思维导图功能(二)
前文链接:Qt实现思维导图功能(一) 百度网盘体验地址: 链接:https://pan.baidu.com/s/1-be0tDJokpZeqhMEuHQntA 提取码:4d1w 注:UI窗体风格参考软 ...
- Qt之使用GraphicsView框架实现思维导图功能
一.简述 我们常见的思维导图类型XMind软件,功能十分强大,提供了各式各样的导图样式.形式,那我们可以用Qt实现思维导图的功能吗,答案肯定是可以的,用图说明. 1.静态方式 读取本地数据的方式进行展 ...
- 思维导图的三招十八式
思维导图的三招十八式 张鄂勇 编著 ISBN978-7-121-14010-5 2012年1月出版 定价:49.00元 16开 396页 宣传语:会降龙十八掌,才混得到九袋弟子. 懂 ...
- 思维导图的三招十八式之梳理
说到思维导图的三招十八式,很多人都希望用它来学习思维导图,里面讲解了很多MindManager和MindMapper的使用方法和技巧,不过,撇除这些,思维导图的三招十八式这本书也是蛮厚实的,想要快速了 ...
- 思维导图培训三:思维导图的应用
思维导图培训三:思维导图的应用 在这个商业社会,个人的价值的体现必须放在社会成功的天平上进行衡量! 这就给各类成功人士提供了一个用自己的成功经验赚钱的机会,他们出书或者办班,向听众大讲特讲许许多多成功 ...
- 【无限思维画布】制作思维导图第三步,节点移动与编辑
正在为无限词典制作单词思维导图功能,实现无限单词导图,无限思维画布.目前制作到第三步,实现节点移动与编辑: 节点移动与编辑 Details 第一步,搜索 github. 一个是比较完善的,基于普通do ...
- 《思维导图的三招十八式》读书笔记
1.书籍信息 --------------------------------------------------------- 书籍名称:思维导图的三招十八式 作者:张鄂勇 出版社:电子工业出版社 ...
- [思维导图学习三] 思维导图的应用
在这个商业社会,个人的价值的体现必须放在社会成功的天平上进行衡量! 这就给各类成功人士提供了一个用自己的成功经验赚钱的机会,他们出书或者办班,向听众大讲特讲许许多多成功必需的所谓品质或条件. 那么,我 ...
- 画思维导图的三招十八式
思维导图在生活中是一种很常见的图表,因为它的实用性所以使用的人越来越多,但是怎么样绘制思维导图却成为了困扰的问题,下面小编给大家分享画思维导图的两种操作方法. 绘制工具:电脑 迅捷画图 操作方法介绍: ...
最新文章
- 认识jQuery及jQuery选择器
- 2019日历全年一张_带上这份2019全年活动日历,旅行打卡不迷路
- 牛津英语3a_空中课堂 | 牛津英语学霸笔记3A M3U2
- [SDOI2017]数字表格
- 把一维数组处理成二维数组
- php双引号解析漏洞
- IP-GUARD内网安全监管系统
- Redis集群搭建与简单使用
- 如何充分利用好大数据的价值
- php易宝支付扫码支付代码_谈谈扫码支付
- java生成xps文件_Java 将 Excel 转为PDF、图片、html、XPS、XML、CSV
- java语法分析器_JavaCC语法分析器
- 合作式智能运输系统通信架构
- 联想小新300加固态_Lenovo 联想 小新310 硬盘移位加装SSD
- 网页制作学习3----实现连缀功能
- ikbc pocker键盘 快捷键说明
- 观《哪吒之魔童降世》有感
- MySQL数据库,数据的约束
- 【Mac 教程系列第 9 篇】如何把 Mac 中的程序坞移动到另一个屏幕
- 浅谈js开源库jQuery
热门文章
- (西安电子科技大学,汤小丹等)计算机操作系统——第二章、进程的描述与控制
- 2022-2027年中国冷冻果汁行业发展监测及投资战略研究报告
- is running 8724480B beyond the ‘PHYSICAL‘ memory limit.
- 在opencv2.4.x版本中处理图像EXIF orientation不统一的问题
- vtkImagePlaneWidget:only works for ortho planes: set plane orientation first
- Scrapy爬虫实战:使用代理访问
- 存储--盘古,阿里云飞天分布式存储系统设计深度解析
- 修改SQL Server 2005 数据库文件名字
- mysqld,mysqld_safe,mysql.server,mysqladmin,mysql,service mysql的理解
- tensorflow 降级