基于QT(C++)实现的日历程序

基于QT实现的日历程序

1 概要

1.1 简介

本篇设计文档主要讲述了计52班的吴启凌根据小学期第一周李国良老师所教的内容,来实现的程序Calendar的设计思路,架构,以及一些设计细节。

1.2 实现的功能

Calendar实现了日历的基本功能以及一些附加功能,主要有

  • 正确地按照公历显示日历。
  • 能够添加、删除、修改事件序列,某个事件在设置时,能够按天,按周,按月重复发生;删除事件时,能删除可重复事件的单个或全部。
  • 能够设置每一天的颜色。
  • 能够与本地文件实现拖拽交互。当用户把文件拖到某一天上时,能够保存到Calendar所在的目录下,并在当天格子内显示文件名。双击某一天能够打开一个对话框,其中显示了该天上的所有文件,并且能够拖拽到本地保存。此外,还设计了一个按钮来打开和关闭拖拽交互。
  • 能够使用配置文件,包括XML和ini文件来保存信息。其中,XML用于保存事件和每天的颜色,ini用于保存语言,是否打开拖拽交互的信息。信息能够通过save按钮保存,也可在关闭程序时自动保存。支持导入,导出XML文件。
  • 可以对日历进行整体拖拽,并设置了一个按钮来固定、解锁界面,锁定后,日历不再响应鼠标动作,并且能将鼠标事件传递到桌面。
  • 国际化:支持中文、英文两种模式。

2 系统架构

2.1 文件结构

Calendar的代码根据界面分组,文件如下

Mycalendar构建了日历的样式及其交互模式,Filesdialog和Listwidget用于显示日期所储存的文件,以及提供拖拽功能,Scheduledialog用于新建及编辑事件,Schedule类用于储存事件,Schedulemanager用于管理事件,而Mainwindow则作为各组件沟通的纽带。

2.2 组件分析

Schedule类用于储存事件的描述,开始、结束日期、重复模式等信息。Schedulemanager提供了对Schedule管理的接口,包括添加、编辑、删除事件,获取某天的事件列表或单个事件,以及获取全部事件。

Scheduledialog用于向用户显示事件的描述、重复模式信息,同时接受用户的编辑。

Listwidget重写了QListWidget的mousePressEvent事件处理函数,在用户对列表中的文件按下鼠标时,传递文件路径的信息。

Mycalendar则是工程中较为重要的一个类,重写了父类的dragEnterEvent和dropEvent来处理鼠标拖入事件,并在鼠标拖入文件时,将文件复制到Calendar所在目录下,并显示在日期格子中。重写了paintCell来获取每个日期的外框的位置信息,以此来判断鼠标将文件拖到了哪一天内;以及在日期中显示文件名,设置日期颜色。重写了resizeEvent来重置datepos中储存的矩形信息,以免造成拖拽的误差。

Mainwindow则是工程中的核心类,用于收集、处理、传递几乎所有的信息。三个public slots用于在三个事件按钮按下时,弹出窗口并收集事件信息;on_calendar_clicked用于在鼠标点击calendar时,在列表框中刷新事件信息,以及在colorbox,即颜色选择框内显示该天的颜色信息;on_actionLock_triggered在lock按钮按下时,固定窗口并设置鼠标穿透;on_checkBox_toggled用于读取是否开启文件拖拽按钮的信息;on_languageBox_currentTextChanged用于设置语言;最后三个槽用于保存配置信息、导入XML、导出XML。

3 用户界面

3.1 主界面

界面如下图1所示,左半边区域为日历部分,中间为功能按钮,右边为事件显示区域。此外工具栏中为lock按钮,菜单栏中Calendar可以弹出下拉菜单。

如图2,3,点击某天后,右侧列表框中会显示当天事件,用户可以点击New按钮来新建事件,或者可以点击列表框中的条目,再点击Edit或Delete按钮来编辑或删除事件,删除时,会出现确认对话框,三个选项分别对应删除单个事件、全部事件、取消删除。

在color标签下方的下拉框中,可以设置某天的颜色。

Language下拉框可以设置语言,设置后需要重启才能生效。需要重新设置一下翻译文件加载的路径。

Enable drag的复选框能够开启、关闭文件拖拽功能。

按lock按钮能够锁定日历,由于锁定后鼠标穿透,需要用快键键Ctrl + L来解锁。

在Calendar的下拉菜单栏中,save能够保存设置,import XML能导入事件、日期颜色设置,export XML能够导出事件、日期颜色设置。

相关推荐
cch89186 小时前
汇编与Java:底层与高层的编程对决
java·开发语言·汇编
荒川之神7 小时前
拉链表概念与基本设计
java·开发语言·数据库
chushiyunen7 小时前
python中的@Property和@Setter
java·开发语言·python
小樱花的樱花7 小时前
C++ new和delete用法详解
linux·开发语言·c++
froginwe117 小时前
C 运算符
开发语言
fengfuyao9858 小时前
低数据极限下模型预测控制的非线性动力学的稀疏识别 MATLAB实现
开发语言·matlab
摇滚侠8 小时前
搭建前端开发环境 安装 nodejs 设置淘宝镜像 最简化最标准版本 不使用 NVM NVM 高版本无法安装低版本 nodejs
java·开发语言·node.js
t198751288 小时前
MATLAB十字路口车辆通行情况模拟系统
开发语言·matlab
yyk的萌8 小时前
AI 应用开发工程师基础学习计划
开发语言·python·学习·ai·lua
Amumu121389 小时前
Js:正则表达式(一)
开发语言·javascript·正则表达式