Qt实现思维导图功能4『撤销回撤机制』

前文链接:Qt实现思维导图功能3『数据导入导出』
思维导图撤销/回撤功能
本文主要利用Qt的撤销/回撤框架QUndoStack、QUndoCommand、QUndoView,来实现思维导图的撤销与回撤功能。

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

效果图
1、动态演示效果:
在这里插入图片描述
2、静态展示图片:
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述

前文BUG维护

序号问题
1维护新创建的节点未能立即与左侧功能窗口状态保持一致的问题
2维护鼠标点击非QGraphicsView区域,例如点击左侧功能菜单或上方菜单,导致节点失去焦点的问题
3维护界面上方菜单和左侧功能菜单状态未能与思维导图节点保持一致的问题
4维护鼠标点击空白区域后,按下Tab键,仍然能够选中前一次被选中的图元问题
5维护删除根节点奔溃问题
6维护导入文件窗口中拖入错误文件(非导图文件)未给出错误提示问题
7维护双击节点输入完文字,按下回车键后节点文本未能立即正确显示的问题(即必须让节点失去焦点才正确显示的问题)

新增功能如下

序号简述具体功能
1添加根节点命令添加/删除根节点
2添加孩子节点命令父节点下添加孩子节点
3添加父节点命令孩子节点与原父节点之间插入新的父节点
4添加同级节点命令孩子节点添加同级节点(父节点添加孩子节点)
5删除根节点命令删除根节点
6删除非根节点命令删除节点自身及其所有子节点
7删除孩子节点命令删除所有孩子节点
8上移节点命令向上移动节点(改变节点在同级节点中的顺序)
9下移节点命令向下移动节点(改变节点在同级节点中的顺序)
10修改节点文本命令记录节点文本的变化(输入完成后按回车键或失去焦点触发)
11撤销功能撤销节点操作(可自由搭配历史记录窗口跳转历史功能)
12回撤功能回撤节点操作(可自由搭配历史记录窗口跳转历史功能)

新增UI如下

序号简述具体功能
1历史记录窗口显示节点操作流程,点击可跳转历史

核心代码
1、撤销/回撤命令的提示信息窗口

#pragma once

/*
 * 思维导图-撤销/回撤命令的提示信息窗口
 */

#include <QWidget>
#include <QPaintEvent>

class QPropertyAnimation;

class UndoCmdToolTip : public QWidget
{
	Q_OBJECT
	Q_PROPERTY(qreal m_alphaF READ alphaF WRITE setAlphaF)
public:
	// 初始化
	static void init();
	// 设置文本
	static void setText(QWidget *widget, const QString &toolTip);
	// 显示
	static void showToolTip();

protected:
	void paintEvent(QPaintEvent *event);
	void showEvent(QShowEvent *event);

private:
	UndoCmdToolTip(QWidget *parent = nullptr);
	~UndoCmdToolTip();
	void setAlphaF(qreal alpha);
	qreal alphaF();

private:
	QString m_toolTip;
	qreal m_alphaF;
	QColor m_color;
	QColor m_bgColor;
	QPropertyAnimation *m_animation;
	static UndoCmdToolTip *m_instance;
};
#include "UndoCmdToolTip.h"
#include <QPainter>
#include <QPropertyAnimation>

UndoCmdToolTip *UndoCmdToolTip::m_instance = nullptr;

UndoCmdToolTip::UndoCmdToolTip(QWidget *parent /*= nullptr*/)
	: QWidget(parent)
{
	m_color = Qt::white;
	m_bgColor = Qt::black;

	m_animation = new QPropertyAnimation(this, "m_alphaF", this);
	m_animation->setDuration(350);
	connect(m_animation, &QPropertyAnimation::finished, this, [&]() {
		m_instance->hide();
	});
}

UndoCmdToolTip::~UndoCmdToolTip()
{

}

void UndoCmdToolTip::init()
{
	if (m_instance == nullptr)
		m_instance = new UndoCmdToolTip;
	m_instance->resize(300, 80);
}

void UndoCmdToolTip::setText(QWidget *widget, const QString &toolTip)
{
	m_instance->setParent(widget);
	m_instance->move((widget->width() - m_instance->width()) / 2, (widget->height() - m_instance->height()) * 0.35);
	m_instance->m_toolTip = toolTip;
	m_instance->m_animation->stop();
	m_instance->hide();
}

void UndoCmdToolTip::showToolTip()
{
	m_instance->show();
}

void UndoCmdToolTip::paintEvent(QPaintEvent *event)
{
	Q_UNUSED(event)

	QPainter painter(this);
	painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing);

	// 绘制背景
	painter.setPen(Qt::NoPen);
	m_bgColor.setAlphaF(m_alphaF);
	painter.setBrush(m_bgColor);
	painter.drawRoundedRect(rect(), 10, 10);
	// 绘制文本
	QFont font = painter.font();
	font.setPixelSize(30);
	painter.setFont(font);
	painter.setPen(m_color);
	painter.setBrush(Qt::NoBrush);
	painter.drawText(rect(), Qt::AlignCenter, m_toolTip);
}

void UndoCmdToolTip::showEvent(QShowEvent *event)
{
	Q_UNUSED(event)

	m_animation->setStartValue(1);
	m_animation->setEndValue(0.15);
	m_animation->start();
}

void UndoCmdToolTip::setAlphaF(qreal alpha)
{
	m_alphaF = alpha;
	update();
}

qreal UndoCmdToolTip::alphaF()
{
	return m_alphaF;
}
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浮生卍流年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值