前文链接: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;
}