前言
书接上文,这篇文章来谈谈如何实现日程提醒功能。
基本思路
- 真正投入使用的日历应该是后台开进程守护监听(我观察到的是这样,没实际参与过工作项目),这样即使用户没有手动开启应用,到了指定时间应用也会强起并且提醒。但是我这个只用于演示,所以就不设置那么复杂了。仅设置为:当用户启动应用后,检索当天 未完成的事项,并设置定时器。
- 在数据库层面,检索当天、未完成的事项并获取与当前时间的间隔只需要一条sql语句:
SELECT *,unixepoch(task_dueTime)-unixepoch(?) as intervaltime FROM tasks WHERE task_dueDate = ? AND unixepoch(task_dueTime)>unixepoch(?),三个占位符依次对应:curTime,curDate,curTime(该Qt项目使用SQLite数据库) - 定时器可用Qt QML中的Timer
- 对于不同的事项,生成各自的Timer,可以采用动态创建组件的方式
- 在数据库层面,检索当天、未完成的事项并获取与当前时间的间隔只需要一条sql语句:
具体实现——动态创建Timer,到期显示窗口提醒
动态创建组件的其中一种方法是:createQmlObject
官方文档是这么写的:
Returns a new object created from the given qml string which will have the specified parent, or null if there was an error in creating the object. If filepath is specified, it will be used for error reporting for the created object.
由于需要动态创建多个Timer,且用完就销毁,不需要知道对应id,所以可以采用匿名函数的方式:
function timerOnce(msec, functor) {
var timer = Qt.createQmlObject('import QtQuick 2.0; Timer {running: true;}',msgdialog,"");
var func = function() {
functor()
timer.destroy()
}
timer.interval = msec
timer.onTriggered.connect(func)
return timer
}
其中,msec是Timer执行的间隔,Timer专注于计时功能;functor是被执行的函数,到了指定时间后执行的动作由它来专门定义。两者各司其职,权限分明,互不干扰。执行完毕后调用destroy()销毁。
在适当的地方调用该函数:(应用启动时、新建任务、更新任务时间后)
timerOnce(interval, function(){msgdialog.open()})
至此,日程提醒的功能就完成了。