技术文档
SVG编辑器大作业
项目设计
- 模块化设计
- 核心功能被划分为多个独立的库,实现了低耦合和高内聚
- 使用LIB确保组件之间的接口清晰
- 设计模式应用
- 命令模式:实现撤销/重做功能
- 工厂模式:用于创建图形和属性面板
- 观察者模式:用于UI组件间通讯
- 单例模式:用于全局管理器类
- 拓展性考虑
- 提供了良好的接口和基类,可以轻松添加新的图形类型
- 属性面板可以动态扩展支持新的图形类型
- 工具栏设计支持添加新的编辑工具
一些关键的功能
Shape类是一个抽象基类,提供了图形属性和操作的通用接口,任何具体的图形类都应该继承这个类并实现其纯虚函数。允许编辑器统一处理不同类型的图形,同时支持通过多态性实现每种图形特定的行为。
ShapeFactory 类实现了工厂设计模式,提供了一个中央位置来创建和管理不同类型的图形。通过这种方式,添加新的图形类型变得更加简单,只需实现新的图形类并在工厂中注册即可。主要特点包括:
- 单例模式:确保全局只有一个工厂实例
- 类型注册机制:允许注册不同的图形类型和它们的创建函数
- SVG解析支持:能够从SVG DOM元素创建相应的图形对象
- 可扩展性:设计支持轻松添加新的图形类型
- 创建方法封装:封装了每种图形的默认创建参数和逻辑
这种设计使得添加新图形类型对系统其他部分的影响最小化,符合开闭原则(对扩展开放,对修改关闭)。
Canvas 类是SVG编辑器的核心组件,负责管理和绘制所有图形,处理用户交互,以及提供文件操作功能。它实现了以下主要功能:
- 图形管理:添加、删除、选择和操作图形对象
- 绘图功能:处理绘制图形的绘图上下文,并应用适当的变换
- 事件处理:处理鼠标和键盘事件,并通过当前工具对象转发这些事件
- 文件操作:加载、保存SVG文件以及导出为PNG
- 撤销/重做:通过命令模式支持撤销和重做操作
- 视图控制:缩放、平移和调整画布大小
- 网格功能:显示网格及对齐到网格
该类充分利用了Qt的事件系统和绘图功能,并通过信号-槽机制与主窗口和其他组件进行通信。
Command 类和相关子类实现了命令模式,用于支持SVG编辑器的撤销/重做功能。这个实现的主要特点:
- 基础命令类 (Command) :继承自Qt的QUndoCommand,提供了execute()方法作为命令执行入口。
- 宏命令 (MacroCommand) :可以组合多个命令成一个原子操作,如拖动多个图形。
- 具体命令类:
- AddShapeCommand:添加图形
- RemoveShapeCommand:删除图形
- MoveShapeCommand:移动图形
- ResizeShapeCommand:调整图形大小
- ChangeZOrderCommand:改变图形层次顺序
- ModifyShapePropertyCommand:修改图形属性
- 命令管理器 (CommandManager) :单例设计,提供命令执行、宏命令管理、创建各种命令的工厂方法等功能。
这些类一起构成了SVG编辑器撤销/重做系统的核心,使用命令模式封装和管理用户操作,实现了操作历史的记录和恢复。注意CommandManager的canUndo、canRedo、undo、redo方法在此实现中是简化的,实际使用时需要将它们连接到具体的UndoStack。
Tool是一个抽象基类,定义了所有绘图和编辑工具必须实现的接口。它处理用户与画布的交互,如鼠标事件和键盘事件。
主要特点:
- 事件处理:提供处理鼠标按下、移动、释放和键盘事件的虚函数
- 绘制功能:tools可以在画布上绘制特殊的视觉效果,如橡皮筋选择框或预览形状
- 游标管理:每个工具可以设置自己的鼠标光标样式
- 名称标识:每个工具必须提供一个名称,用于UI显示和标识
具体的工具类(如选择工具、矩形绘制工具等)将继承这个基类并实现这些抽象方法,提供各自特定的行为和功能。
这个PropertyPanelFactory类实现了工厂设计模式,用于创建适合不同图形类型的属性面板。主要特点:
- 单例模式:确保整个应用程序中只有一个工厂实例,便于集中管理和访问
- 注册机制:允许注册和管理针对不同图形类型的面板创建函数
- 自动匹配:根据图形的类名自动创建对应的属性面板
- 可扩展性:轻松添加对新图形类型的支持,只需注册一个新的创建函数
- 默认面板支持:如果某个图形类型没有专门的面板,会使用基础面板
这个工厂类与PropertyPanelContainer协同工作,为SVG编辑器提供了灵活且可扩展的属性编辑界面。通过这种设计,添加新的图形类型和对应的属性面板变得非常简单,只需两步:创建新的面板类,然后在工厂中注册即可,完全符合开闭原则(对扩展开放,对修改封闭)。
一些缺点和Bug
- 直线的大小调整问题,应该选择从QRectf中获取属性,绘制直线
- 同时选中多个图形时,有的图形的线条不再显示
- 属性面板不够完善,不能对每个图形都有专属的属性面板
- 撤销重做的命令性能太差,有概率崩溃
- ui设计太潦草,部分的按键功能不完全
- svg文件不能正确导入
项目运行效果展示



浙公网安备 33010602011771号