作者肯定是前期没有做好架构设计,什么都想就只有一个大概的思路,然后就开始写,写着写着发现有新的类需要定义为Controller之类的东西,然后才独立出Controller,但是可能是没有理解好Controller的概念,所以导致Controller之间竟然是相互耦合的,这玩鸡毛啊。
你代理模式,代理的啥?讲不出来,也就是你根本就搞不懂项目中的哪个模式到底是怎样的模型咯。
真正架构是需要设计出来,然后严格实践的,而不是写完之后,按照模糊的逻辑讲述出来的。
我做这个项目的目的是:
- 应用自身所学的软件工程技术。
- 锻炼自己的软件设计能力。
- 锻炼自身文档编写能力。
- 锻炼自己的依据设计实现的编码能力。
- 将项目从无到有的设计过程公开到互联网上,给他人学习大型项目从零构建的过程,同时也接收他人的意见,提升自己的能力。
这个项目需要有:
- 明确的项目需求。
- 准确且优秀的软件设计。
- 严格且优雅的代码规范,以及严格按照软件架构来实现软件,降低软件的耦合度并提高可维护性,且便于他人学习。
- 完备的项目文档,将项目分模块向自己也是向他人进行解释,让这个软件能被更多的人理解,且从中学习到东西,应用到自己的软件上。
- 完成的项目需要有好的性能(这需要充分利用计算机资源,需要有性能的规划),至少不能是卡顿的,有各种Bug的半成品。
- 对项目的工作量进行评估,对各类知识点进行总结,整理成文档,或者写出学习途径,让别人不需要自行去筛选信息学习额外的知识。这同时也是对自我能力的总结和提高。
我依旧在这个项目中使用MVC架构进行软件架构的设计。同时,对项目的总体设计,对模块的细节设计,都需要进行抽象化,最好能细分到类。
要实现的效果是,可以通过介绍一个类的组成部分有什么功能,然后我们利用这些功能去完成本类的需求。
这就要求类之间的耦合度一定不能太高。
我打算采用增量模型来进行本项目的开发。
前期使用快速原型模型熟悉项目需求应该如何满足,明确了项目需求之后,使用增量模型进行软件的开发。
对于本项目来说,需要解决的首要问题是:如何实现一个简单的白板而非一个可维护、可扩展的白板。
当明确好我们可以实现这个东西之后,我们就可以设计一个可维护的、可扩展的功能丰富的白板。
在实现完白板的基本功能后,满足了一定的性能需求后,我们就可以对白板进行扩展,比如:我可以将一个PDF文档加载到白板中,对该文档进行白板操作。这个时候是否就是以PDF为背景,然后画白板?
所以我们的白板需要有背景?
-
任务一:Qt实现画图板。
实现了大半功能,但优化不足,需要学习更多的方法来完成大型白板项目框架的搭建。
-
任务二:Qt加载PDF文档作为画图板的背景
-
任务三:进行白板软件的需求分析
-
任务四:进行白板软件的系统设计
-
任务五:进行白板软件的详细设计
-
任务六:明确项目代码管理方案、系统测试方案。
-
任务七:依据系统设计进行项目实现,每天对实现的功能进行总结,每当实现一个模块就对模块的完成情况进行总结,并总结出相较于设计的模块不同点,这种不同是否会影响项目设计目标。并模块进行测试。
-
任务八:基本完成项目总体,对总体进行测试,并优化性能,修改Bug。
-
任务九:发视频介绍该项目,并总结经验。
在这之中,我们还需要思考一些功能如何完成:
- 白板文件怎么存储?
- 配置系统如何搭建?
- 界面如何进行设计?
- 设计模式怎么应用?项目哪里能够应用以此来解耦?
总之,这是一个综合性的Qt项目,既要有强大的软件工程管理、设计能力实践,又要有快速的且高效的编码能力,还要有Qt特性的实践,以及GUI性能方面的调优实践。拥有这种经验的人,基本上都需要进行实际的工作才能锻炼出来,而在这里我妄想通过自我强制般的任务规划来完成这个项目。
QPainterPath
似乎对于画曲线有着辅助功能,具体了解一下该类对象有何作用。- GraphicsView框架似乎对于撤销操作和橡皮擦不好实现,只能以图元为单位进行消除,不能以“笔迹”为单位消除。
对于GraphicsView框架而言,如果将已写下的笔画作为图元进行管理,那当我们实现橡皮擦时,我们可能需要使用碰撞检测来实现(但如果用矩形来表示笔迹图元的话不够精确,误差很大,这样就会导致绘画的不精确)。
所以难道我们需要另寻方法实现白板软件,那我的GraphicsView岂不是白学了?
GraphicsView其实更适用于类似ProcessOn这种应用。
用来写白板可能不太适配。
但是不使用GraphicsView,笔迹如何进行放缩、移动?这又是一个问题。也就是说,这是一个两难的问题。
-
如果我们要使用GraphicsView实现绘图板,就需要解决上述问题。橡皮擦,撤销操作之类的如何进行?
-
而使用普通的QPainter配合QImage实现绘图板,就需要解决QImage上的图形如何移动,放缩的问题。
白板项目需求分析
本项目采用迭代模型进行开发,因为迭代模型适合学习其中的知识,技术、方案设计等等都可以随着自身技术水平的上升而进行迭代。
白板项目的总体设计。
- 界面设计。
- 图形项模块。
- 白板模块。
- 钢笔模块。
- 其他功能设计,如:缩放、移动、选择笔迹等。
- 书架设计。
- PDF导入导出设计。此功能依赖于白板如何管理图形项。
- 配置文件设计。
- 白板保存功能的功能设计。
白板项目界面总体设计
我将整个白板分为三个层次结构,自底向上分别是:
Item
,详细看下面的介绍。Scene
,Scene只需要知道自己手下有许多Item
就可以了,它不需要知道这些Item具体是什么?我们尽管加进去,它本身更像是Item
的一个容器。Scene
还会负责管理一个特殊的BackgroundItem
,该BackgroundItem具有默认值(可能是一张白纸,也可能是用户指定的其他东西)。Scene
需要保证BackgroundItem
永远是出于最下层的Item,而不会遮盖其他的Item。View
,View的任务是将多个Scene
以单页或多页的模式组织起来,然后渲染出来,并且当用户点击某个页面时,我们还需要将事件传递到对应的Scene
中,这涉及到事件转发的内容。由于Qt中提供的QGraphicsView
不能够满足我们的这个需求,所以我们必须自己实现一个View
。View
的具体实现可以参考QPdfView
,其实现方式跟我们需要的View有相同的点,只是将PDF换成了多个Scene。
Item层次结构设计
Scene层次结构设计
View层次结构设计
设计阶段对设计的验证和测试