# 基于Qt的图形化界面日历程序
# 一 需求分析
应用Qt的图形界面设计设计一款拥有多种功能的、可跨平台使用的日历程序,实现包括给日期添加、删除事件、上色、支持文件拖拽和数据配置同步等功能。
支持Windows、Linux和OS X平台。
主要功能如下:
- 编辑事件
- 用户可以通过单击来设置添加、删除每一天的事件,并且软件需支持按照某些规律一次性添加多个事件,并且在删除时也可以选择单独删除或批量删除
- 软件需支持给日历中每一天添加或删除颜色
- 文件拖拽,软件需实现本地文件与桌面日历程序的拖拽交互:
- 把本地文件拖入桌面日历程序的某一天,在当天的格子内显示文件名称,并且把文件存入桌面日历程序的某个文件夹下
- 可以通过日历程序把存放在某天的文件通过拖拽文件名称存放到本地文件夹内进行保存
- 设置一个按钮用来打开和关闭桌面日历程序与本地文件的拖拽交互
- 数据同步
- 软件需要支持使用数据文件进行数据同步,支持用户导出所有事件和对应颜色数据到配置文件中,并支持程序导入该该配置文件
- 固定与透明
- 可以对日历进行整体的拖拽和固定,且在固定后日历中的透明区域不再响应鼠标事件,并且让鼠标事件依然传递到桌面上
- 国际化
- 软件需支持中文,英文两种模式
# 二 程序设计
## 2.1 界面模块
界面模块由MainWindow类组成,它继承QWidget类,并包含了另外三个模块的头文件。由于界面全部由代码生成,此类中包含一个calend二的指针和许多的QPushButton和QCheckBox等组件。
主界面由previewGroupBox和genetalOptionGroupBox组成,为垂直分布的界面。previewGroupBox中包含了日历和一些为了拖拽而设置的释放区域,genetalOptionGroupBox中包含了各种各样的对于日历的设置按钮,并且限制了genetalOptionGroupBox的高度使日历的大小正常。在这个模块中,包含多个为了更新整个程序状态而设置的潜和事件过滤器。包括了一个事件过滤器,过滤出拖拽进来和拖拽出去的事件,并获得此时接受文件的Label的编号和文件名,然后调用calendar类和storage类中的函数对事件进行储存。还有一个每当翻页就会触发的updateIndex(int,int),可以实时更新当前页面的年份和月份以方便之后更新事件。最后就是一个在程序开始和结束时自动读取和保存全部事件的函数,这个函数保证了用户在打开程序后程序的事件信息与之前用户关闭的时候一样。
## 2.2 拖拽模块
拖拽模块由dragthings类组成,继承QLabel类,并包含了另外3个模块的头文件。此类中一是设计了拖放区域的属性,拖放区域为QLabel。二是设计了对于拖放事件的函数。拖放主要包括,dragEnter , drop, mousePressed和mouseMove这四个事件。
dragEnte:负责在被拖拽文件到达拖拽区域的时候判断是否接受;
drop负责在文件被放置后判断是哪个地方放置了文件并保存,然后在对应的天上显示文件名并加上<file
here>的字样;
mousePressed负责在拖出是判断有文件即将被拖出;
mouseMove负责判断文件是否被拖出,并将文件复制到新的地址并删除原来关于这个文件的信息。
## 2.3 日历模块
日历模块由calendar类组成,继承QCalendar Widge七类。此类中包括对于日历的事件,颜色等添加删除的addNotre() , deleteNote() 和paintacolor() 函数,和调用storage中的重构函数storeToFile()来讲对于日历的操作储存起来。还有bool数组isdragsth来判断日历中的每一天是否被拖拽了文件。另外还有重组函数dragEnd(),在每次的拖进或者拖出结束后都进行判断,并将事件调用重组函数storeToFile() 进行储存。
## 2.4 储存模块
储存模块有storage类组成。此类中包含了对于日历的各种操作和时间的的存储函数。存储数据采用的是生成QJsonObject的方法,通过QJsonDocument将其存储为字符串,然后储存在文件后缀为.json的文件中。类中包含重构函数storeToFile()来讲用户配置转化成 json 格式的字符串,在通过exportFile()函数将其输出至指定的文件中。
# 三 程序实现
本软件由界面模块MainWindow,拖拽模块dragthings,日历模块calendar和储存模块storage四个模块组成。
- 界面模块包含了自己通过代码构建的主页面和在进行各种的事件添加操作时弹出的窗口和获取上层的功能的接口,主要控制和用户的交互。
- 拖拽模块中包含了对于各种拖拽文件事件的处理函数。
- 日历模块包含了对于日历的基本设置,给日历添加删除事件和上色等功能的接口,储存模块包括对于整个软件的事件的存储和导出的接口。
这三个模块主要是日历程序所包含的主要功能。
程序包含两部分:
- 一部分是程序的**源代码**,包含main.cpp, mainwindwow.cpp,mainwindow.h, dragthings.cpp, dragthings.h, storage.cpp, storage.h, calendar.cpp, calendar.h和src资源文件Johncalendar. qm和Linguist的翻译文件lohncalendar.ts
- 另一部分就是构建生成的**应用程序**和它的目录下的拖拽生成的文件夹以及**config.json文件**
# 四 运行测试
程序运行界面主要包括主窗口和各个功能弹出的小窗口。
其中主窗口大小不可以改变,生成的小窗口总共只能有一个。
程序运行图如下:
![](http://www.writebug.com/myres/static/uploads/2021/10/19/694f27ef3e7da3044cf1957087765011.writebug)
![](http://www.writebug.com/myres/static/uploads/2021/10/19/0822604847ce29bf2e342c9c1dc6ea58.writebug)
![](http://www.writebug.com/myres/static/uploads/2021/10/19/da83e1b884f9b28b81a44e64e044440e.writebug)