日历 - 使用 Qt 框架的带笔记的日历
一个简单的带笔记功能的日历
引言
该程序使用 Qt 框架编写 - 现代跨平台开发工具。Qt 允许您通过为每个操作系统编译程序,而无需更改源代码,即可在大多数现代操作系统上运行用它编写的软件。它包含开发应用程序软件时可能需要的所有主要类,从 GUI 元素到用于处理网络、数据库和 XML 的类。Qt 完全面向对象,易于扩展,并支持组件编程技术。
背景
在工作过程中,我需要一个显示全年日历的小部件。标准的 Qt 小部件 QCalendarWidget 旨在仅显示一个月。我尝试使用 QAbstractTableModel - 抽象模型来编写我自己的小部件,您可以创建它的子类来实现您自己的表格模型。我的小部件同时显示年度和月度日历。允许您选择一周的开始日期,添加和删除一周的注释。
使用代码
在工作过程中,我使用了 Qt 版本 5.8.0 和 Microsoft Visual Studio 2013。注意:使用 Qt 5.8.0 版本编译的程序由于使用了函数 - GetUserPreferredUILanguages,因此无法在 Windows XP 上运行。如果计算机未安装 Visual Studio 2013,要运行该程序,您需要 Microsoft Visual C++ 2013 Redistributable Package。
关注点
CalendarGadget
- 显示月度日历的类,包含带有模型 MyCalendarModel 的 QTableView。
为了在模型 MyCalendarModel 中存储信息,使用了以下结构
struct Record
{
int day;
int month;
int year;
bool notes_present;
};
该结构中的数据由函数 CalendarModel::updateModel()
写入。在没有 beginResetModel()
和 endResetModel()
的情况下,无法正确更新数据。要返回模型存储的数据,请使用函数 CalendarModel::data(const QModelIndex &index, int role)
。此外,使用此函数和 Qt :: ToolTipRole,将显示鼠标光标下的日期的注释列表。
为了存储 CalendarGadget
类型的对象,使用了非常方便的 QVector
类,它引用容器类,并提供按索引访问项目以及许多额外的便捷方法。
QVector <CalendarGadget*> Calendars;
for (int i = 1; i <= 12; i ++)
{
CalendarGadget *gad = new CalendarGadget;
Calendars.append(gad);
gad->setMonth(i);
connect(year, SIGNAL(valueChanged(int)), gad, SLOT(gotoYear(int)));
connect(firstDay, SIGNAL(currentIndexChanged(int)), gad, SLOT(firstDayChanged(int)));
}
为了存储注释,我使用了 QSQLite,它将是 Qt 数据库驱动程序,用于 SQLite 数据库。日历注释存储在 myQtCalendar.exe 启动的文件夹中的 calendar.db 文件中。为了使框架能够找到驱动程序,我在程序的文件夹中使用了以下代码
QString plugins_patch = QCoreApplication::applicationDirPath();
QStringList paths = QCoreApplication::libraryPaths();
paths.append(plugins_patch + "/plugins/");
为了执行 SQL 命令,在建立连接后,使用了 QSqlQuery
类。每个请求都使用 QSqlQuery::lastError()
分析错误。为了直接编辑注释、删除和添加,我使用了从 QDialog 继承的 addNote()
类。
历史
- 版本 0.1
- 初始版本
- 版本 1.0
- 添加笔记处理。错误修复。