C#如何做简易网站,app下载安装注册,湖南建设银行官网网站首页,梓潼网站建设目录
1. Command 概览
2. Command2D 1. Command 概览 功能#xff1a;命令栈基类#xff0c;用来实现撤销和重做功能。
其子类Command2D和Command3D都是实现父类方法#xff0c;除了构造函数没有自己的独有方法。
字段#xff1a;
redoCommands#xff1a;存储re…目录
1. Command 概览
2. Command2D 1. Command 概览 功能命令栈基类用来实现撤销和重做功能。
其子类Command2D和Command3D都是实现父类方法除了构造函数没有自己的独有方法。
字段
redoCommands存储redo重做命令栈其实就是QStackQString undoCommands存储undo撤销命令栈。
方法
logAdd记录添加标注logDelete记录删除标注logMove记录移动标注logChange记录更改标注undo撤销功能redo重做功能
#ifndef COMMAND_H
#define COMMAND_H
#includeQStack
#includeNamespace.h/// \brief 命令栈基类用来实现撤销和重做功能
class My::Command{public:/// \brief 存储undo撤销命令栈QStackQString undoCommands;/// \brief 存储redo重做命令栈QStackQString redoCommands;/// \brief 记录添加标注virtual void logAdd(int index);/// \brief 记录删除标注virtual void logDelete(int index,int id);/// \brief 记录移动标注virtual void logMove(int index,float xoffset,float yoffset,int id0);/// \brief 记录更改标注virtual void logChange(int index,QString s1,QString s2);/// \brief 撤销功能virtual void undo();/// \brief 重做功能virtual void redo();virtual ~Command()0; // 将其声明为纯虚函数强制要求任何继承自 Command 的类都要提供自己的析构函数实现。
};#endif // COMMAND_H2. Command2D
继承自Command类
字段多了一个manager存放中心组件指针CentralWInit2D* manager中心窗口
方法和父类一样。
/*!
* \file command2d.cpp
* \brief 2d命令栈类
* \author 王澳
* \date 2019.09
*/#includeCommand2D.h
#includeLabel.h
#includemainwindow.h
#includeQObject/// \brief 2d中心组件的记录添加 将添加标注的操作记录到命令栈中以便后续进行撤销。
void My::Command2D::logAdd(int index){ // 表示添加标注的索引QString sQString(Add %1).arg(index); // s表示添加标注的命令undoCommands.push_back(s);redoCommands.clear(); // 在执行新的命令时清空之前可能存在的可以重做的命令。
}/// \brief 2d中心组件的记录删除 将删除标注的操作记录到命令栈中以便后续进行撤销操作。
void My::Command2D::logDelete(int index,int id){ // index表示删除标注的索引。id表示删除标注的唯一标识符.QString sQString(Delete %1 %2).arg(index).arg(id);undoCommands.push_back(s);redoCommands.clear();
}/// \brief 2d中心组件的记录移动 将移动标注的操作记录到命令栈中以便后续进行撤销操作。
void My::Command2D::logMove(int index,float xoffset,float yoffset,int id){QString sQString(Move %1 %2 %3).arg(index).arg(xoffset).arg(yoffset);undoCommands.push_back(s);redoCommands.clear();
}/// \brief 2d中心组件的记录改变 记录了标注的改变操作。当用户改变标注的文字时
void My::Command2D::logChange(int index,QString s1,QString s2){QString sQString(Change %1 %2 %3).arg(index).arg(s1).arg(s2);undoCommands.push_back(s); // 格式是类似于 Change index oldLabel newLabelredoCommands.clear();
}/// \brief 2d中心组件的撤销动作 包含4中操作Add, Delete, Move, Change
void My::Command2D::undo(){if(undoCommands.count()0)return;// 获取最近一次的命令记录。QString sundoCommands.top();undoCommands.pop_back();QStringList lists.split( ); // 使用空格作为分隔符将命令字符串拆分为列表// 执行一次undo函数只撤销一个命令。if(list[0]Add){ // 命令格式Add index// 将形状移至 trashshapes 并更新 redoCommands 堆栈int indexlist[1].toInt();manager-trashshapes.append(manager-label-shapes[index]);manager-label-shapes.removeAt(index);QString strQString(Add %1 %2).arg(index).arg(manager-trashshapes.length()-1);redoCommands.push_back(str); // 执行撤销命令后有反悔药。// 发送删除label信号通知其他组件emit(manager-labelDeleted(index));manager-label-update(); // 并更新 label 小部件}if(list[0]Delete){ // 命令格式Delete index id// 从 trashshapes 中检索形状并插入回 label-shapes因为上一步删除后形状会放置在trashshapesint indexlist[1].toInt();int idlist[2].toInt();manager-label-shapes.insert(index,manager-trashshapes[id]);QString strQString(Delete %1).arg(index);redoCommands.push_back(str);emit(manager-labelAdded(manager-trashshapes[id],index));manager-label-update();}if(list[0]Move){ // 移动标注命令格式Move index xoffset yoffsetint indexlist[1].toInt();float xoffset0;float yoffset0;xoffset-list[2].toFloat(); // 减去offset就回到之前的位置。yoffset-list[3].toFloat();manager-label-shapes[index]-offset(xoffset,yoffset); // 形状对象修改自己的位置信息QString strQString(Move %1 %2 %3).arg(index).arg(-xoffset).arg(-yoffset);redoCommands.push_back(str);manager-label-update();}if(list[0]Change){ // 标注类别的改变命令格式Change index oldLabel newLabelint indexlist[1].toInt();QString s1list[2]; // oldLabelQString s2list[3];manager-label-shapes[index]-labels1; // 形状的属性label类别名称redoCommands.push_back(s);emit(manager-labelChanged(index,manager-label-shapes[index]));manager-label-update();}
}/// \brief 2d中心组件的重做动作
void My::Command2D::redo(){if(redoCommands.count()0)return;QString sredoCommands.top();redoCommands.pop_back();QStringList lists.split( );if(list[0]Add){int indexlist[1].toInt();int idlist[2].toInt();manager-label-shapes.insert(index,manager-trashshapes[id]);QString strQString(Add %1).arg(index);undoCommands.push_back(str);emit(manager-labelAdded(manager-trashshapes[id],index));manager-label-update();}if(list[0]Delete){int indexlist[1].toInt();manager-trashshapes.append(manager-label-shapes[index]);int idmanager-trashshapes.length()-1;manager-label-shapes.removeAt(index);QString strQString(Delete %1 %2).arg(index).arg(id);undoCommands.push_back(str);emit(manager-labelDeleted(index));manager-label-update();}if(list[0]Move){int indexlist[1].toInt();float xoffsetlist[2].toFloat();float yoffsetlist[3].toFloat();manager-label-shapes[index]-offset(xoffset,yoffset);QString strQString(Move %1 %2 %3).arg(index).arg(xoffset).arg(yoffset);undoCommands.push_back(str);manager-label-update();}if(list[0]Change){int indexlist[1].toInt();manager-label-shapes[index]-labellist[3];undoCommands.push_back(s);emit(manager-labelChanged(index,manager-label-shapes[index]));manager-label-update();}
}