【小白课程】openKylin“闹钟”工具的设计与实现原理介绍
openKylin“闹钟”工具是社区自研的一款操作简易的桌面实用工具,不仅支持设置闹钟,还配置了倒计时和秒表功能,通过界面顶部对应的图标可进行切换,并可在闹钟和计时器中设置不同的铃声提醒。
openKylin“闹钟”工具安装及相关软件包:
$sudo apt install ukui-clock
一、openKylin“闹钟”工具功能介绍
openKylin“闹钟”工具功能包括:闹钟、倒计时和秒表。打开首页菜单选项下拉,选择“帮助”将自动跳转至用户手册,可查看该工具的操作说明。选择“关于”可查看当前版本信息。
1.闹钟
- 点击“添加”可添加闹钟,并设定时间、闹钟名、重复日、铃声及稍后提醒时间。
- 双击闹钟,可进入编辑闹钟界面。或者右键点击闹钟,可选择“编辑”或者“删除”该闹钟。
2.倒计时
- 倒计时设置界面可设定时间和铃声。时间设定可滚动数字盘设置,也可以双击输入数字设定。
- 点击“开始”进入倒计时运行界面,大滚动盘中显示预计响铃时间和剩余时间。
- 点击迷你窗口按钮,隐藏闹钟应用,显示迷你窗口。
- 在迷你窗口中,点击主窗口按钮,可回到闹钟倒计时运行界面。
- 点击“暂停”,计时暂停。
- 点击“结束”,计时结束并回到倒计时设置界面。
3.秒表
- 秒表可以计时和计次。点击“开始”即开始计时。点击“计次”可记录计次、计次间隔时间,计时不中断。标签分别表示最长和最短的间隔时间记录。
- 点击“暂停”可记录最终时间。
- 点击“复位”,清除秒表。
二、openKylin“闹钟”工具实现原理
openKylin“闹钟”工具基于QT实现,主要涉及QTiner类和信号槽机制。所以在讲闹钟工具具体实现之前,简单介绍一下这两个类。
1.QTimer
QTimer类提供了定时器信号和单触发定时器。闹钟到时响铃、倒计时响铃、秒表执行以及秒表的计次间隔都用到了定时器。单触发定时器闹钟没有应用。
操作函数:
- bool isActive() const 返回定时器运行状态
- int timerId() const 返回定时器id
- void setInterval(int msec) 设置定时器间隔(毫秒级别)
- int setInterval() 返回定时器间隔
- void start() 开启定时器
- void stop() 暂停定时器
信号:
- void timeout() 超时信号
2.信号槽机制
信号槽机制是QT的核心特性。接触过QT的对信号槽应该不陌生,所以这里仅作简单介绍。信号和槽用于多个对象之间的通信,QT的源对象系统是信号和槽实现是基础。
简单使用方法如下:
connect(sender, SIGNAL(signal()), receiver, SLOT(slot()));
其中,sender是发射信号的对象的名称,signal()是信号名称。信号可以看做是特殊的函数,需要带括号,有参数时还需要指明参数。receiver是接收信号的对象名称,slot()是槽函数的名称,需要带括号,有参数时还需要指明参数。
最常见适用于GUI界面操作的响应,如QPushButton的按钮点击,发出clicked()信号,关联的槽函数被自动执行。
三、openKylin“闹钟”工具实现方法
openKylin“闹钟”工具功能主要有三部分:闹钟、倒计时和秒表。闹钟界面、闹钟列表和计次列表都是基于QlistWidget实现的自定义封装类。对QT使用者来说,QListWidget操作使用较为简单应该不用再多介绍,其他部分也大多都是界面的绘制和界面操作相关的信号槽,因此下面仅介绍核心实现方法。
1.闹钟
(1)闹钟到时响铃实现原理:
每秒轮询,遍历闹钟对比系统时间看是否到达时间,到达时间响铃。
connect(timer_clock, SIGNAL(timeout()), this, SLOT(timerUpdate()) ); timer_clock->start(1000); //每秒轮询 timerUpdate
(2)稍后提醒实现原理:
响铃提示弹窗的稍后提醒按钮后,稍后提醒定时器启动,每秒轮询时间是否到达,到时后,若通知类型为闹钟且该闹钟存在则重新初始化弹窗和加载铃声。
//稍后提醒的定时connect(timer_xumhuan, SIGNAL(timeout()), this, SLOT(ring())); timer_xumhuan->setInterval(1000); //每秒轮询ring//稍后提醒响铃
(3)响铃及提示弹窗停留实现原理:
到时闹钟响铃同时启动定时器,设定60s后,关闭弹窗和铃声。
//剩余秒 减1connect(timer, SIGNAL(timeout()), this, SLOT(close_music())); timer->setInterval(1000); //每秒轮询close_music
(4)判断是否时间到
新建/编辑、删除:闹钟显示界面,使用QlistWidget展示创建的闹钟列表信息。根据操作的闹钟主键ID,进行对应的增删改查操作,并将操作同步到数据库中,同时刷新闹钟列表信息。
2.倒计时
实现原理:点击开始按钮后,启动倒计时定时器,剩余时间减一并更新倒计时剩余时间,时间归零后响铃提示。
//倒计时执行 connect(countdown_timer, SIGNAL(timeout()), this, SLOT(statCountdownMsec()));//设置定时器每个多少毫秒发送一个timeout()信号countdown_timer->setInterval(10); statCountdownMsec//倒计时执行 剩余时间减一 更新倒计时时间updateCountdownTime 是否时间归零
倒计时暂停/继续:根据暂停/继续状态,对倒计时定时器countdown_timer进行stop()/start()。
3.秒表
秒表实现原理:秒表开启后,开启秒表总定时器,为了秒表的精度问题,设定10毫秒发送一次timeout()信号,并记录秒表总时间。
connect(timer, SIGNAL(timeout()), this, SLOT(CountDown()));/*设置定时器每个多少毫秒发送一个timeout()信号 Set the timer to send a timeout () signal every milliseconds*/timer->setInterval(10); CountDown//秒表执行 记录秒表总时间
计次间隔原理:间隔时间的记录和秒表执行一样,但是每次计次后清零再计算时间。
//秒表的 每次计次后清零重新计算的时间connect(timer_2, SIGNAL(timeout(), this, SLOT(stopwatchJg()));
以上就是关于openKylin“闹钟”工具实现原理的基本介绍,根据各式各样的用户需求,闹钟的功能仍在不断优化,未来,欢迎更多小伙伴加入,共同完善openKylin“闹钟”工具功能。