当前位置: 首页 > article >正文

基于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能够导出事件、日期颜色设置。


http://www.kler.cn/a/444094.html

相关文章:

  • CS 144 check5: down the stack (the network interface)
  • Unity 3D饼状图效果
  • 【ETCD】【源码阅读】深入分析 storeTxnWrite.Put方法源码
  • SQL Server 解决游标性能问题的替代方案
  • Win10将WindowsTerminal设置默认终端并添加到右键(无法使用微软商店)
  • PCL点云库入门——PCL库中点云数据拓扑关系之K-D树(KDtree)
  • QT基础和练习
  • 利用Python爬虫获取微店商品详情API接口的深入指南
  • 蓝桥杯——竞赛省赛国赛题分享
  • React中定义和使用函数式组件
  • 天天 AI-241215:今日热点-OpenAI发布ChatGPT Projects,万能工具箱上线!
  • Vue零基础教程|从前端框架到GIS开发系列课程(五)组件式开发
  • Quartz 架构和单体应用介绍
  • 汽车IVI中控开发入门及进阶(三十八):HiCar开发
  • 数据结构,链表的简单使用
  • UDP基本了解
  • 为什么要用单例模式?
  • windows C#-命名实参和可选实参(下)
  • C/C++语言——解题
  • 机试题——维修工
  • UI框架DevExpress XAF v24.2新功能预览 - .NET Core / .NET增强
  • Flutter控件FutureBuilder控件详解
  • uniapp使用百度地图配置了key,但是显示Map key not configured
  • Unity 根据文本宽度自动移动图像位置
  • thinkphp5命令行,addOption和addArgument有什么区别
  • 51c自动驾驶~合集41