Skip to content

Aderversa/WhiteBoard

Repository files navigation

我的白板项目规划

白板项目

作者肯定是前期没有做好架构设计,什么都想就只有一个大概的思路,然后就开始写,写着写着发现有新的类需要定义为Controller之类的东西,然后才独立出Controller,但是可能是没有理解好Controller的概念,所以导致Controller之间竟然是相互耦合的,这玩鸡毛啊。

你代理模式,代理的啥?讲不出来,也就是你根本就搞不懂项目中的哪个模式到底是怎样的模型咯。

真正架构是需要设计出来,然后严格实践的,而不是写完之后,按照模糊的逻辑讲述出来的。


我做这个项目的目的是:

  • 应用自身所学的软件工程技术。
  • 锻炼自己的软件设计能力。
  • 锻炼自身文档编写能力。
  • 锻炼自己的依据设计实现的编码能力。
  • 将项目从无到有的设计过程公开到互联网上,给他人学习大型项目从零构建的过程,同时也接收他人的意见,提升自己的能力。

这个项目需要有:

  • 明确的项目需求。
  • 准确且优秀的软件设计。
  • 严格且优雅的代码规范,以及严格按照软件架构来实现软件,降低软件的耦合度并提高可维护性,且便于他人学习。
  • 完备的项目文档,将项目分模块向自己也是向他人进行解释,让这个软件能被更多的人理解,且从中学习到东西,应用到自己的软件上。
  • 完成的项目需要有好的性能(这需要充分利用计算机资源,需要有性能的规划),至少不能是卡顿的,有各种Bug的半成品。
  • 对项目的工作量进行评估,对各类知识点进行总结,整理成文档,或者写出学习途径,让别人不需要自行去筛选信息学习额外的知识。这同时也是对自我能力的总结和提高。

我依旧在这个项目中使用MVC架构进行软件架构的设计。同时,对项目的总体设计,对模块的细节设计,都需要进行抽象化,最好能细分到类。

要实现的效果是,可以通过介绍一个类的组成部分有什么功能,然后我们利用这些功能去完成本类的需求。

这就要求类之间的耦合度一定不能太高。

我打算采用增量模型来进行本项目的开发。

前期使用快速原型模型熟悉项目需求应该如何满足,明确了项目需求之后,使用增量模型进行软件的开发。

对于本项目来说,需要解决的首要问题是:如何实现一个简单的白板而非一个可维护、可扩展的白板。

当明确好我们可以实现这个东西之后,我们就可以设计一个可维护的、可扩展的功能丰富的白板。

在实现完白板的基本功能后,满足了一定的性能需求后,我们就可以对白板进行扩展,比如:我可以将一个PDF文档加载到白板中,对该文档进行白板操作。这个时候是否就是以PDF为背景,然后画白板?

所以我们的白板需要有背景?

  • 任务一:Qt实现画图板。

    实现了大半功能,但优化不足,需要学习更多的方法来完成大型白板项目框架的搭建。

  • 任务二:Qt加载PDF文档作为画图板的背景

  • 任务三:进行白板软件的需求分析

  • 任务四:进行白板软件的系统设计

  • 任务五:进行白板软件的详细设计

  • 任务六:明确项目代码管理方案、系统测试方案。

  • 任务七:依据系统设计进行项目实现,每天对实现的功能进行总结,每当实现一个模块就对模块的完成情况进行总结,并总结出相较于设计的模块不同点,这种不同是否会影响项目设计目标。并模块进行测试。

  • 任务八:基本完成项目总体,对总体进行测试,并优化性能,修改Bug。

  • 任务九:发视频介绍该项目,并总结经验。

在这之中,我们还需要思考一些功能如何完成:

  • 白板文件怎么存储?
  • 配置系统如何搭建?
  • 界面如何进行设计?
  • 设计模式怎么应用?项目哪里能够应用以此来解耦?

总之,这是一个综合性的Qt项目,既要有强大的软件工程管理、设计能力实践,又要有快速的且高效的编码能力,还要有Qt特性的实践,以及GUI性能方面的调优实践。拥有这种经验的人,基本上都需要进行实际的工作才能锻炼出来,而在这里我妄想通过自我强制般的任务规划来完成这个项目。

任务一总结

采用GraphicsView框架实现画图板

  • QPainterPath​似乎对于画曲线有着辅助功能,具体了解一下该类对象有何作用。
  • GraphicsView框架似乎对于撤销操作和橡皮擦不好实现,只能以图元为单位进行消除,不能以“笔迹”为单位消除。

对于GraphicsView框架而言,如果将已写下的笔画作为图元进行管理,那当我们实现橡皮擦时,我们可能需要使用碰撞检测来实现(但如果用矩形来表示笔迹图元的话不够精确,误差很大,这样就会导致绘画的不精确)。

所以难道我们需要另寻方法实现白板软件,那我的GraphicsView岂不是白学了?

GraphicsView其实更适用于类似ProcessOn这种应用。

用来写白板可能不太适配。

但是不使用GraphicsView,笔迹如何进行放缩、移动?这又是一个问题。也就是说,这是一个两难的问题。

  • 如果我们要使用GraphicsView实现绘图板,就需要解决上述问题。橡皮擦,撤销操作之类的如何进行?

  • 而使用普通的QPainter配合QImage实现绘图板,就需要解决QImage上的图形如何移动,放缩的问题。

需求分析

白板项目需求分析

本项目采用迭代模型进行开发,因为迭代模型适合学习其中的知识,技术、方案设计等等都可以随着自身技术水平的上升而进行迭代。

总体设计

白板项目的总体设计。

  • 界面设计。
  • 图形项模块。
  • 白板模块。
  • 钢笔模块。
  • 其他功能设计,如:缩放、移动、选择笔迹等。
  • 书架设计。
  • PDF导入导出设计。此功能依赖于白板如何管理图形项。
  • 配置文件设计。
  • 白板保存功能的功能设计。

白板项目界面总体设计

设计文档

我将整个白板分为三个层次结构,自底向上分别是:

  1. Item​,详细看下面的介绍。
  2. Scene​,Scene只需要知道自己手下有许多Item​就可以了,它不需要知道这些Item具体是什么?我们尽管加进去,它本身更像是Item​的一个容器。Scene​还会负责管理一个特殊的BackgroundItem​,该BackgroundItem具有默认值(可能是一张白纸,也可能是用户指定的其他东西)。Scene​需要保证BackgroundItem​永远是出于最下层的Item,而不会遮盖其他的Item。
  3. View​,View的任务是将多个Scene​以单页或多页的模式组织起来,然后渲染出来,并且当用户点击某个页面时,我们还需要将事件传递到对应的Scene​中,这涉及到事件转发的内容。由于Qt中提供的QGraphicsView​不能够满足我们的这个需求,所以我们必须自己实现一个View​。View​的具体实现可以参考QPdfView​,其实现方式跟我们需要的View有相同的点,只是将PDF换成了多个Scene。

Item层次结构设计

Scene层次结构设计

View层次结构设计

编码实现

设计阶段对设计的验证和测试

About

A WhiteBoard project for study GraphicsView

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published